2010-03-07 51 views
3

我有一個文件名爲文件三行:爲什麼我的-p單行打印我想跳過的行?

行一個
線兩條
線三條

當我這樣做:

的perl -ne「打印if/one /'檔案

我得到這樣的輸出:

行一個

當我試試這個:

的perl -pe '未來除非/一個/' 文件

輸出是:

行一個
線兩條
線樹

我希望既一行代碼相同的輸出。我的期望錯了還是錯了別的?

回答

8

你的期望是錯的。該-p開關把下面的循環在你的代碼:

LINE: 
    while (<>) { 
     ...    # your program goes here 
    } continue { 
     print or die "-p destination: $!\n"; 
    } 

如果你讀the documentation for next,它說:

需要注意的是,如果有以上一continue 塊,它將獲得 執行即使在丟棄的線上。

next居然跳到continue block(如果有的話),它可以追溯到循環的條件之前。

你可以做類似

perl -pe '$_ = "" unless /one/' file 
1
$ perl -ne 'next unless /one/ && print' file 
line one 
3

首先關於在程序中使用的選項:

-n assume "while (<>) { ... }" loop around program 
-p assume loop like -n but print line also, like sed 

perl -ne 'print if /one/' file 

僅打印第一行作爲其中包含字符串「one」的唯一行。

perl -ne 'next unless /one/' file 

不會打印任何東西,因爲它沒有調用打印並沒有-p選項。

perl -pe 'next unless /one/' file 

如上幾乎相同,沒有從程序本身輸出但由於-p選項的,被印刷在文件的每一行。