如何为<>混合命令行参数和文件名?在Perl?

时间:2010-02-26 21:25:40

标签: perl input arguments

考虑以下愚蠢的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”或其他东西中读取?为什么?

3 个答案:

答案 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;

自行使用它们