parse(*ARGV)
是最简单的解决方案:解释有点长,但是学习如何有效使用 Perl 的一个重要部分是学习 Perl。
当您使用空文件句柄 ( <>
) 时,它实际上是从ARGV
具有特殊语义的神奇文件句柄中读取的:它从名为 in 的所有文件中读取@ARGV
,或者STDIN
如果@ARGV
为空。
来自perldoc perlop
:
空文件句柄<>
很特殊:它可以用来模拟 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>
非魔法。)
您不必<>
在while
循环中使用——my $data = <>
将从第一个非空文件中读取一行,一次my @data = <>;
将其全部吞下,您可以*ARGV
像普通文件句柄一样传递。