【问题标题】:Why does my -p one-liner print the lines I'm trying to skip?为什么我的 -p one-liner 会打印我要跳过的行?
【发布时间】:2010-03-07 08:02:39
【问题描述】:

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

第一行
第二行
第三行

当我这样做时:

perl -ne 'print if /one/' 文件

我得到这个输出:

第一行

当我尝试这个时:

perl -pe 'next unless /one/' 文件

输出是:

第一行
第二行
行树

我希望两个单行的输出相同。我的期望是错误的还是其他方面的错误?

【问题讨论】:

    标签: perl


    【解决方案1】:

    你的期望是错误的。 -p switch 在您的代码周围放置以下循环:

    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
    

    【讨论】:

      【解决方案2】:

      首先关于程序中使用的选项:

      -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选项,文件的每一行都被打印出来了。

      【讨论】:

        【解决方案3】:
        $ perl -ne 'next unless /one/ && print' file
        line one
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-09-26
          • 2015-02-04
          • 2019-12-07
          • 2015-08-19
          • 1970-01-01
          • 2015-06-03
          • 2017-06-23
          • 2015-12-12
          相关资源
          最近更新 更多