<>についての議論(p5p MLより)

perl5-porters[perl #2783]あたりから始まる<>についての議論を考えてみた。といってもp5pのスレッドはほとんど読んでないのでこの議論そのものがどういう流れになっているかは知らない(後で読む)。<>(引数を省略した行入力演算子)は@ARGVにファイル名が入っているものとして@ARGVの中身を一つ一つ読んでいく機能だが,その引数はPerlの2-arg openによって処理されるので,引数として"zcat foo.gz |"や"GET http://example.com/ |"を渡すことができる。これはこれで便利なのだが,"rm -rf |"といったものも受け付けるのでどうにも気持ちが悪く,純粋にファイル名として処理する機能も欲しい。
そこでPerlIOの出番ですよ。せっかくのPerlIOなのだからこういうときこそ活用しなければ。グローバル変数に頼らなくてすむのもいい。ファイルを連結するレイヤなので,catという名前がぴったりだ。

use PerlIO::cat;
open my $in, '<:cat', 'foo.txt', 'bar.txt';
while(<$in>){ # foo.txtを読み終えたらbar.txtを読む
    print;
}

なお,まだコードは一行も書いてない。