2017-04-02 8 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"とは何ですか?どういう意味ですか?私は最初の出力は私が望む出力ですが、なぜ2番目のコードを使って得ることができないのでしょうか? perlのにperl 2つのスクリプトの違いは何ですか

+0

あなたが持っているインプットとあなたが期待するアウトプットを示してください。あなたが直面している実際の問題の他に、[perlrun](http://perldoc.perl.org/perlrun.html)の閲覧を取る – stevieb

答えて

2

-pフラグがループでスクリプトをラップ:

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

:それは$_に各ラインを読み、あなたのスクリプトが実行され、その後$_を出力します。これはあなたの最初のスクリプトスニペットが依存しているものです。

2番目のスクリプトは何かを印刷しますが、それでPerlはそれ自身のprintをスキップしませんので、それ以降は元の値$_が表示されます。これを回避するには、-pの代わりに-nフラグを使用します。これは、自動printがない場合を除いて同じように動作します。

+0

ありがとう!それはとても役に立ちました! –

関連する問題