Perl入門 ≫ LESSON18 入出力
標準入力
入力とは、perlプログラムに対して値を入れること。出力は、perlプログラムが値を出すことす。
入出力ともにコマンドプロンプト(標準入出力)、ファイルの両方があります。
今のところ、コマンドプロンプト画面に出力する標準出力のみ扱ってきました。残り、
まずは標準入力から見ていきましょう。
Perlスクリプトを実行する時に、コマンドプロンプトから引数を渡すことができます。
perl スクリプト名 引数1 引数2 ....
引数はこのように指定します。
そして、この引数はスクリプト中で@ARGVという配列に保存されています。
ちょっとやってみましょう。
#!c:\perl\bin\perl -w
use strict;
print "@ARGV";
これを実行してみます。適当な引数を二つ渡しましょう。
C:\src> perl test.pl abc def←リターン
abc def ←結果(@ARGV)
引数は”abc””def”という二つの文字列です。
この二つの引数は、配列@ARGVに順番に格納されます。
最初の引数”abc”は$ARGV[0]に、次の”def”は$ARGV[1]にそれぞれ入ります。
各引数をダブルクォートで囲っても同様です。
が、普通、引数の値は一つ以上の半角スペースで区切って書くので、
スペースを引数の中に含めたい時は、ダブルクォートで囲いましょう。
C:\src> perl test.pl "abc d" "def"
これは”abc d”、”def”がそれぞれ@ARGVに入ります。
*)シングルクォートを使っても同じ効果は得られません。
シングルクォートも引数の一部になってしまいます。
C:\src> perl test.pl 'abc d' 'def'
これを実行すると、”'abc”と”d'”、”'def'”という3つの要素になってしまいます。
さてもう一つ。コマンドプロンプトからの標準入力を試してみましょう。
下のスクリプトを書きます。
#!c:\perl\bin\perl -w
use strict;
my $v1 = <>;
print "$v1";
これを実行してみます。
と、何故かプロンプトが返ってきません。
実はスクリプト中の<>は標準入力からの入力を取るので、
コマンドプロンプトから何か入力するまでここで止まっています。
何か入れてみましょう。
C:\src> perl test.pl
abc←これを入力して改行します
abc
入力した値をそのまま表示しています。
<>は、改行まで(改行を含む)を入力値として取り込みます。
当然<>は複数回実行することができます。
すると、入力する回数が決まっていないが、スクリプトを実行させたい場合、
繰り返し<>を実行し、コマンドプロンプトからの入力終了の合図で終わりにすることができます。
終わりの合図はCtrl-D(コントロールキーを押しながらdを押す)。
が!PCではこれはきかないようです。Ctrl-Cを使いましょう。
#!c:\perl\bin\perl -w
use strict;
while(<>) {
print;
}
ファイル入出力
ファイルから値を入力したり、ファイルに出力することができます。
そのためには、ファイルを開き(ファイルオープン)、そのファイルにアクセスするためにファイルハンドルを設定し、使い終わったらそのファイルを閉じます(ファイルクローズ)。
ファイルハンドルは適当な文字列を自分で設定します。
open ファイルハンドル,モードとファイル名
:
ファイルハンドルを使った操作
:
close ファイルハンドル
モードとはファイルを開く時のモードで、読み込み用・書き込み用・・・とその時の用途ごとに使い分けます。 モードとファイル名は合わせて(続けて)書く他に、「モード,ファイル名」と分けて書くこともできます。
< | 読み込みのみ。 |
---|---|
> | 書き込みのみ。必要に応じてファイルを新規作成。 |
<< | 追加モードでファイルをオープン。必要に応じてファイルを作成。 |
+> | 入出力を同時に行う。 |
+< | 入出力を同時に行う。ただし、最初にファイルを作成するかサイズを0に設定する。 従って、自分が書いたデータしか読むことができない。 |
+<< | 読み込みと追加書き。 |
|- | コマンドに出力するたのパイプをオープン。 |
-| | コマンドから結果を読込むためのパイプをオープン。 |
今度はファイルハンドルを使った操作を見てみましょう。
●ファイルを読み込む
<ファイルハンドル>
で、ファイルの最初の行から一行ずつ読込みます。<ファイルハンドル>一回で一行だけ読み込みます。
読込んだ値は特殊変数$_に格納されるか、自分で別の変数に保存します。
●ファイルに書き込む
print ファイルハンドル 出力内容
で、そのファイルに書き込みができます。
ファイルを読み込んでみましょう。
#open関数の結果が0の場合(オープン失敗)は次の処理を行います。
#die関数は、文字列を出力してそこで処理を終了します。
open(FILE, "<test.txt") || die "file open error!";
#ファイルが最後の行(EOF)に到達するまで読込む
while(<FILE>) {
print;
}
close(FILE);
ファイルを読み込んでそのまま出力します。
ファイルに書き込んでみましょう。
open(FILE, ">test2.txt") || die "file open error!";
#ファイルに書き込む
print FILE "test";
close(FILE);
中に”test”とだけ書かれたファイルが作成されました。
このファイル名がすでに存在する場合は実行するたびに何度でも上書きされます。
”>>”を利用する場合、ファイルは新規に作られず追加書きされます。
ファイルへの入出力は他にも色々方法があります。次の「入出力関数」で説明します。
コマンドプロンプトからファイル入出力
perlを実行するコマンドプロンプトからファイルを読み込むこともできます。
<ARGV>
で、@ARGVに指定されたフィルから順々にデータを読込みます。引数が指定されなければ、 標準入力から読込みます。
#!c:\perl\bin\perl -w
use strict;
while(<ARGV>) {
print;
}
これを実行してみます。ファイル名を二つ渡しましょう。
C:\src> perl test.pl test.txt test.txt←リターン
ファイルtest.txtの内容が2回続けて出力される。