まくまくPerlノート
ダイヤモンド演算子を使って標準入力とファイルからの入力に対応する
2008-03-09

ダイヤモンド演算子 <>(行入力演算子)を使うと、Unix ユーティリティの cat コマンドや sort コマンドのように、ユーザが起動パラメータで指定したファイルからテキスト読み込みを行うことが出来ます。 さらに、ファイル名が省略された場合や、ファイル名として - が指定された場合は、標準入力が読み込まれます。

ダイヤモンド演算子を利用すれば、次のように色々な入力に対応したプログラムを作成することができます。

$ ./myprog      # 標準入力から読み込み
$ ./myprog -    # 標準入力から読み込み
$ ./myprog file1            # file1 から読み込み
$ ./myprog file1 file2      # file1 と file2 から読み込み
$ ./myprog file1 - file2    # file1、標準入力、file2 の順で読み込み
$ echo 'hoge' | ./myprog    # echo 出力(標準入力)から読み込み
$ echo 'hoge' | ./myprog file1 - file2    # file1、echo 出力、file2 の順で読み込み

ダイヤモンド演算子は、行入力演算子 <STDIN> と同じように使用できます。 ダイヤモンド演算子を使ってテキストを読み込むと、すべての入力を結合したテキストを読み込んでいるかのように振舞います。 すべての行を読み終わった後は、undef を返します。

while (<>) {
    print;    # $_ を出力
}

こう書くこともできます。

print while <>;

次のように書いても同様です。

while (defined(my $line = <>)) {
    print $line;
}

ダイヤモンド演算子の入力元の判断は、起動パラメータを格納している @ARGV 配列変数の値をもとに決めらます。 @ARGV の値を変更すると、ダイヤモンド演算子の入力元を制御できます。

@ARGV = ('file1', '-', 'file2');  # file1、標準入力、file2 の順で読み込み
while (<>) {
    print;
}
2008-03-09