我怎么能在Perl混合命令行参数和文件名的<>?
题
考虑以下傻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;
不隶属于 StackOverflow