【发布时间】:2010-03-07 08:02:39
【问题描述】:
我有一个名为 file 的文件,包含三行:
第一行
第二行
第三行
当我这样做时:
perl -ne 'print if /one/' 文件
我得到这个输出:
第一行
当我尝试这个时:
perl -pe 'next unless /one/' 文件
输出是:
第一行
第二行
行树
我希望两个单行的输出相同。我的期望是错误的还是其他方面的错误?
【问题讨论】:
标签: perl
我有一个名为 file 的文件,包含三行:
第一行
第二行
第三行
当我这样做时:
perl -ne 'print if /one/' 文件
我得到这个输出:
第一行
当我尝试这个时:
perl -pe 'next unless /one/' 文件
输出是:
第一行
第二行
行树
我希望两个单行的输出相同。我的期望是错误的还是其他方面的错误?
【问题讨论】:
标签: perl
你的期望是错误的。 -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
【讨论】:
首先关于程序中使用的选项:
-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选项,文件的每一行都被打印出来了。
【讨论】:
$ perl -ne 'next unless /one/ && print' file
line one
【讨论】: