ダイヤモンド演算子(<>)の動き
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