为什么我的-p one-liner打印出我想要跳过的行?

时间:2010-03-07 08:02:39

标签: perl

我有一个名为file的文件有三行:

  

第一行   第二行   第三行

当我这样做时:

  

perl -ne'打印if / one /'file

我得到了这个输出:

  

第一行

当我尝试这个时:

  

perl -pe'next除非/ one /'file

输出是:

  

第一行   第二行   线树

我预计两个单线的输出相同。我的期望是错的还是错的?

3 个答案:

答案 0 :(得分: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 :(得分: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选项,文件的每一行都被打印出来。

答案 2 :(得分:1)

$ perl -ne 'next unless /one/ && print' file
line one
相关问题