为什么这个oneliner - 回声“你好”| perl -e'<&gt ;;打印'不起作用

时间:2014-01-06 22:13:29

标签: perl

我仍然是Perl的新手,并且有一个问题就是要理解为什么这个衬垫无效。

我的理解是它从输入读取$_然后打印应该能够打印出来但它不等待键盘的输入而且不打印任何东西。

[admin@mb125:~/src/test/scripting] : echo "hello" | perl -e '<>; print'

我知道print之前<>是否有效,如下所示

[admin@mb125:~/src/test/scripting] : echo "hello" | perl -e 'print <>'
hello

任何人都可以解释为什么第一个班轮不起作用吗?

感谢

2 个答案:

答案 0 :(得分:8)

没有作业的

<>只会自动分配给$_,如果它的使用方式如下:

while (<>)

由于您在while之外使用它,因此这种特殊情况不适用。

答案 1 :(得分:0)

这是另一个看起来像你正在寻找的单线:

echo "world" | xargs perl -e 'print "Hello " . (shift @ARGV) . "\n"; '

Perl脚本从命令行获取参数并将它们存储在特殊变量@ARGV中。因此,如果您使用"perl myscript.pl foo bar baz"调用的Perl脚本,则@ARGV将包含['foo','bar','baz']。然后,您可以使用shift, pop$array[$n]等数组运算符来访问数据。

xargs(在本例中)将带有参数的参数传递给它并将它们传递给Perl脚本,就像它们是命令行参数一样。这是一个非常方便的功能。

哦,如果你这样做,你必须在(shift @ARGV)周围加上括号。否则Perl在到达"not an ARRAY reference"时会抛出"\n"错误,或者至少是我的错误。