<>と

昨日の続き。フィルタプログラムのようなスクリプトの場合リダイレクトするのもファイル名を引数として渡すのも大差はない。しかしファイル名以外をオプションとして渡すような場合は問題になる。ファイルハンドルSTDINを明示するスクリプトと、略したスクリプト2つを比較する。

<>

# hoge.pl
# ファイルハンドルSTDIN省略
use strict;
print reverse <>;
print "パラメータリスト @ARGV\n"

hoge.plは次のように使える
>perl hoge.pl < foo.txt # foo.txtの内容をリダイレクト
>perl hoge.pl foo.txt # foo.txtの内容がファイルハンドル<>に展開される。
>perl hoge.pl foo.txt bar.txt boo.txt # foo.txt, bar.txt, boo,txtの内容が連結されてファイルハンドル<>に展開される。

一方次のような使い方は問題が発生する。
>perl hoge.pl < foo.txt fuga # fugaをファイル名として展開しようとする。foo.txtは無視される。
>perl hoge.pl < foo.txt bar.txt boo.txt # bar.txt boo.txtの内容が連結され<>に展開される。foo.txtは無視される。

ファイルハンドルSTDINを明示する場合は以下のようになる。

# hoge1.pl
# ファイルハンドルSTDIN明示コード
use strict;
print reverse <STDIN>;
print "パラメータリスト @ARGV\n"

hoge.plは次のように使える
>perl hoge1.pl < foo.txt # foo.txtの内容をリダイレクト
>perl hoge1.pl foo.txt # foo.txtを第一引数とし、標準入力(今の場合はキーボード)からの入力を受け付ける
>perl hoge1.pl foo.txt bar.txt boo.txt # foo.txt, bar.txt, boo,txtを引数リストとして標準入力(今の場合はキーボード)からの入力を受け付ける。


結論としてはフィルタプログラムのようなスクリプトの場合は積極的に<>を使う方が使いでがあるだろう。コマンドライン引数を利用するようなスクリプトの場合はSTDINを明示することになる。


ということがわかった上で<>とを考える。少なくとも自分がperlを使う場面ではコマンドライン引数を使用してSTDINを明示するより<>を使ってリダイレクトさせる方がうれしい。だからコマンドライン引数を使わずにスクリプト中で<>からもらう方法で処理してしまうだろうな。