2017-08-10 147 views
0

輸入到Perl是這樣的:這是什麼代碼做perl的

ID NALT NMIN NHET NVAR SING TITV QUAL DP G|DP NRG|DP 
PT-1RTW 1 1 1 4573 1 NA 919.41 376548 23.469 58 
PT-1RTX 0 0 0 4566 0 NA NA NA 34.5866 NA 
PT-1RTY 1 1 1 4592 1 NA 195.49 189549 24.0416 18 
PT-1RTZ 0 0 0 4616 0 NA NA NA 44.1474 NA 
PT-1RU1 0 0 0 4609 0 NA NA NA 28.2893 NA 
PT-1RU2 2 2 2 4568 2 0 575.41 330262 28.2108 49 
PT-1RU3 0 0 0 4617 0 NA NA NA 35.9204 NA 
PT-1RU4 0 0 0 4615 0 NA NA NA 30.5878 NA 
PT-1RU5 0 0 0 4591 0 NA NA NA 26.2729 NA 

這是代碼:

perl -pe 'if($.==1){@L=split;foreach(@L){$_="SING.$_";}$_="@L\n"}' 

我有點猜到它處理的第一行加星到每個單詞。但最後一部分$_="@L\n"是做什麼的?沒有這個,這段代碼不起作用。

+0

最後一部分重新分配上述編輯的第一線('SING.text' )複製到默認變量'$ _',然後與其他行一起用'「\ n」'打印。 – fugu

+0

它改變文件中的第一行; https://eval.in/844205 –

回答

2

-p命令行開關使perl進程輸入(或命令行列出的文件)「逐行」並打印處理後的行。行內容存儲在$_變量中。在打印之前,$_="@L\n"將新值賦予$_

較短的版本:perl -pe 'if($.==1){s/(^|)/$1SING./g}'


Deparsed(更可讀的)的一行以上:

perl -MO=Deparse -pe 'if($.==1){@L=split;foreach(@L){$_="SING.$_";}$_="@L\n"}'

LINE: while (defined($_ = readline ARGV)) { 
    if ($. == 1) { 
     @L = split(' ', $_, 0); 
     foreach $_ (@L) { 
      $_ = "SING.$_"; 
     } 
     $_ = "@L\n"; 
    } 
} 
continue { 
    die "-p destination: $!\n" unless print $_; 
} 
0

最後一行將修改後的單詞組合成一個完整的行,並將其分配給$_,這是在使用-p時處理每行後將打印的內容。 (您可能從the perlrun manual section on -p推斷出這一點。)