考虑以下傻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.

任何想法,这是为什么?当它到达<>是它试图从(不存在)的文件,“sample_argument”什么看?为什么?

有帮助吗?

解决方案

<>是简写“从@ARGV指定的文件中读取信息,或者如果@ARGV是空的,然后从STDIN读取”。在你的程序中,@ARGV包含值("sample_argument"),所以Perl的尝试,当你使用<>操作员从该文件中读取。

您可以通过清除@ARGV你到<>线之前将其修复:

$firstarg = shift @ARGV;
print $firstarg;
$input = <>;       # now @ARGV is empty, so read from STDIN
print $input;

其他提示

请参阅所述PerlIO的手册页,其内容在部分:

的空文件句柄<>是特殊的:它可以被用于模拟的sed的行为 和awk。从<>输入是无论是从标准输入,或从每个文件中列出的 在命令行上。下面是它如何工作的:第一次<>被评估时, @ARGV阵列被检查,并且如果它是空的,$ ARGV [0]设置为“ - ”,其中,当 打开给你标准输入。然后将@ARGV阵列被处理为的列表 文件名。

如果你想STDIN,使用标准输入,不<>

默认情况下,perl的消耗命令行参数作为用于<>输入文件。你已经使用过之后,你应该自己消耗他们shift;

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top