2017-04-02 108 views
0
echo ab cd ef | perl -pe 'if($.==1){@L=split;foreach(@L) 
{$_="SING.$_";}$_="@L\n"}' 
SING.ab SING.cd SING.ef 

echo ab cd ef | perl -pe 'if($.==1){@L=split;foreach(@L) 
{$_="SING.$_";}print"@L\n"}' 
SING.ab SING.cd SING.ef 
ab cd ef 

什么是$_="@L\n"在做什么?这是什么意思?我想第一个输出是我想要的输出,但为什么我不能使用第二个代码?perl这两个脚本之间有什么区别

+0

请显示您有什么输入以及您期望的输出。除了您可能遇到的实际问题,请仔细阅读[perlrun](http://perldoc.perl.org/perlrun.html) – stevieb

回答

2

-p标志perl的包装脚本在一个循环:

LINE: while (<>) { 
    … your script … 
} 
continue { 
    die "-p destination: $!\n" unless print $_; 
} 

换句话说:它读取每行到$_,运行脚本,并打印$_之后。这是你的第一个脚本片断所依赖的。

你的第二个脚本自己打印某些东西,但不会让Perl跳过它自己的print,所以它最终会打印出原始值$_。您可以通过使用-n标志而不是-p来绕过此操作 - 除非没有自动print,它的行为方式相同。

+0

非常感谢!这非常有帮助! –