考虑以下愚蠢的Perl程序:
$firstarg = $ARGV[0];
print $firstarg;
$input = <>;
print $input;
我从终端运行它,如:
perl myprog.pl sample_argument
并收到此错误:
Can't open sample_argument: No such file or directory at myprog.pl line 5.
为什么会这样?当它到达&lt;&gt;它试图从(不存在的)文件,“sample_argument”或其他东西中读取?为什么?
答案 0 :(得分:12)
<>
是“从@ARGV
中指定的文件中读取,或者如果@ARGV
为空,则从STDIN
读取”的简写。在您的程序中,@ARGV
包含值("sample_argument")
,因此当您使用<>
运算符时,Perl会尝试从该文件中读取。
您可以在到达@ARGV
行之前清除<>
来修复此问题:
$firstarg = shift @ARGV;
print $firstarg;
$input = <>; # now @ARGV is empty, so read from STDIN
print $input;
答案 1 :(得分:8)
请参阅perlio手册页,其中部分内容为:
空文件句柄&lt;&gt;很特别:它可以用来模拟sed的行为 和awk。来自&lt;&gt;的输入来自标准输入,或来自列出的每个文件 在命令行上。以下是它的工作原理:第一次&lt;&gt;被评估, 检查@ARGV数组,如果为空,则将$ ARGV [0]设置为“ - ”,当 打开为您提供标准输入。然后将@ARGV数组作为列表处理 文件名。
如果您想要STDIN,请使用STDIN,而不是<>
。
答案 2 :(得分:1)
默认情况下,perl使用命令行参数作为<>
的输入文件。在使用它们之后,您应该使用shift;