parse(*ARGV)
が最も簡単な解決策です。説明は少し長くなりますが、Perl を効果的に使用する方法を学ぶ上で重要な部分は、Perl を学ぶことです。
null ファイルハンドル ( <>
) を使用すると、実際にARGV
は特別なセマンティクスを持つ魔法のファイルハンドルから読み取ります: で指定されたすべてのファイルから読み取り@ARGV
ます。STDIN
@ARGV
からperldoc perlop
:
null ファイルハンドル<>
は特別です: sed と awk の動作をエミュレートするために使用できます。からの入力<>
は、標準入力から、またはコマンド ラインにリストされた各ファイルから取得されます。これがどのように機能するかです: 初めて<>
が評価され、@ARGV
配列がチェックされ、空の場合$ARGV[0]
は に設定され"-"
、開かれると標準入力が得られます。次に、@ARGV
配列はファイル名のリストとして処理されます。ループ
while (<>) {
... # code for each line
}
次の Perl ライクな擬似コードと同等です。
unshift(@ARGV, '-') unless @ARGV;
while ($ARGV = shift) {
open(ARGV, $ARGV);
while (<ARGV>) {
... # code for each line
}
}
ただし、言うのはそれほど面倒ではなく、実際に機能します。実際に@ARGV
配列をシフトし、現在のファイル名を
$ARGV
変数に入れます。また、ARGV
内部でファイルハンドルを使用します。これは魔法のように<>
の同義語です。<ARGV>
(上記の疑似コードは<ARGV>
、非魔法として扱われるため機能しません。)
ループで使用<>
する必要はありません。最初の空でないファイルから 1 行を読み取り、一度にすべて丸呑みし、通常のファイルハンドルであるかのように渡すことができます。while
my $data = <>
my @data = <>;
*ARGV