Perl でフィルタを書く際の注意

perl はフィルタを書くことを支援してくれるが、注意しなくてはならない場合もある。その一つが eof の扱いだ。

行単位で処理するフィルタに複数のファイルを読み込ませる場合でも、各ファイルの末端で何か処理したい場合がある。
空のダイヤモンド演算子を使っている場合には引数なしの eof を判定すれば良い。
ところが、別の箇所でファイルハンドルを処理していると意図しない動きになる。eof は、最後に開いたファイルハンドルの状態を返す、のであって、ダイヤモンド演算子で開いているファイルハンドルの状態を返す訳ではない。マニュアルに明確に記載されている。
ダイヤモンド演算子で開いている、すなわち入力の複数ファイルの末端をチェックしたい場合は、明示的に ARGV を引数として eof を呼び出す。

自分は気付かずにしばらくデバッグに時間を費やした。Perl の文脈依存のデフォルト値にはとにかく注意しなくては…。

教訓1。フィルタにいろいろな事をさせない。入力1、出力1がフィルタなので、別のファイルを読み込むという仕様に問題がある。Keep It Simple, Stupid.
教訓2。デフォルト値を信じず、明示する。

Python だとどうなるか後で試す事。