ダイヤモンド演算子(<>)の動き

Larry の娘さんが名づけたというダイヤモンド演算子、"<>"。標準入力を受け取るものだと今まで思っていた。実際簡単なスクリプトを書くときには良く使用してもいた。・・・が、実は相当違うものだった。

==> a <==
file a

==> b <==
file b

==> c <==
file c

==> d <==
file d

==> do.pl <==
while(<>) {
  print;
}

上記のように、a,b,c,d という4つのファイルを用意し、
a だけを引数にすると、

% perl do.pl a
file a

となる。つまり、引数とされたファイル a の内容を1行毎に while ループで読み込み、print で表示してくれるわけだ。


で、引数を二つ与えると、これも勝手に解釈してくれる。

% perl do.pl a b
file a
file b

さらに、"-" を使うと、標準入力として解釈してくれ、引数リストの中途にはさむとその順番で while ループを回してくれる。・・・意味不明の説明だが、つまりこういうことだ。

% perl do.pl a - c d < b
file a
file b
file c
file d

引数リストに、a,b,c,d と与えるかわりに、b が相当する場所に、標準入力を示す "-" を指定、そして、標準入力からは b の内容を指定する。その結果、ちゃんと a,b,c,d の順にファイルの中身が連結されて表示されていることがわかる。


これ、知らなかったの?って言われそうな内容だなー。ええ、知らなかったんです・・・。


付け加えると、ダイヤモンド演算子は、@ARGV から読み込みするべきファイルを見つけているため、while ループの実行前に、@ARGV 配列の中身をいじくると・・・

% cat do.pl 
push @ARGV, "e";  # @ARGV に "e" を追加してやる
while(<>) {
  print;
}

以下のような感じで、あたかも引数に e が指定されたかのような振る舞いをする。

% perl do.pl a - c d < b
file a
file b
file c
file d
file e