如果您正在使用 perl 在命令行上寻找快速解决方案,这对于flip-flop
操作员来说是一个理想的情况。现在,有两种方法可以在极端情况下解释这个问题——只要pattern1
出现之前,这两种方法的功能都是一样的pattern2
:
如果pattern1在 pattern2之后但在pattern3之前,则删除pattern1和pattern3之间的所有内容
或者,如果pattern1在 pattern2之后但在pattern3之前什么都不做,除非你看到另一个pattern1。
在我们开始之前,请注意 perl 的争论-p
-n assume "while (<>) { ... }" loop around program
-p assume loop like -n but print line also, like sed
现在,首先,我给你..
perl -pe'$x ||= /7/; $_= "" if /5/ .. /8/ and $x' <(seq 1 10)
1
2
3
4
5
6
9
10
$x ||= /7/
: 这设置$x
为/7/
when $x
is的返回值false
。匹配时/7/
会返回。true
这意味着$x
在第一次匹配时设置为 true,并且本质||=
是永远不会在变量已经为 true 时设置它。
然后它设置$_ = ''
范围是否在和之间/5/
,/8/
并且它已经设置$x
为真。记住短路的工作方式:a && b
意味着b
只有在a
评估为时才运行true
。在这种情况下,评估的事实a
将设置触发器操作符的状态——这就是我们想要的;然而,我们只希望在$_ = ''
已经看到的情况下发生7
。
现在,对问题的第二种解释只需切换顺序......
perl -pe'$x ||= /7/; $_= "" if $x and /5/ .. /8/' <(seq 1 10)
这将打印整个范围。Perl/5/
直到找到/7/
. 在我们的连续范围内,这不会发生。
顺便说一句,要真正让其中一些答案感到羞耻,许多空间都不是必需的......
perl -pe'$x||=/2/;$_=""if$x&&/5/../8/' # secksey