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像普通文件句柄一样传递。