什么是触发器操作符?

我最近听说过有关Perl和Ruby中带有正则表达式的触发器,但是我无法找到它们是如何工作的以及常见的用例。

任何人都可以用语言无关的方式解释这个吗?

现在我明白了它是什么,以及它是如何工作的,我想简单地说一下这个问题:什么是触发器操作符?

当左操作数为真时,Perl中的触发器运算符求值为true,并且在右操作数为真之前保持求值为true。 左右操作数可以是任何类型的表达式,但大多数情况下它与正则表达式一起使用。

使用正则表达式,它可用于查找两个标记之间的所有行。 这是一个简单的例子,展示了它的工作原理:

use Modern::Perl; while () { if (/start/ .. /end/) { say "flip flop true: $_"; } else { say "flip flop false: $_"; } } __DATA__ foo bar start inside blah this is the end baz 

对于从startthis is the end所有行,触发器操作符都是真的。

运算符的双点版本允许第一个和第二个正则表达式在同一行上匹配。 所以,如果您的数据看起来像这样,上面的程序只适用于行start blah end等待:

 foo bar start blah end inside blah this is the end baz 

如果您不希望第一个和第二个正则表达式匹配同一行,则可以使用三点版本: if (/start/ ... /end/)

请注意,应注意不要将触发器操作符与范围操作符混淆。 在列表上下文中, ..具有完全不同的function:它返回顺序值列表。 例如

 my @integers = 1 .. 1000; #makes an array of integers from 1 to 1000. 

我不熟悉Ruby,但Lee Jarvis的链接表明它的工作方式类似。

这是@ dan1111演示的直接Ruby翻译(说明Ruby比Perl的flip_flop更多):

 while DATA.gets if $_ =~ /start/ .. $_ =~ /end/ puts "flip flop true: #{$_}" else puts "flip flop false: #{$_}" end end __END__ foo bar start inside blah this is the end baz 

更惯用的ruby:

 DATA.each do |line| if line =~ /start/ .. line =~ /end/ puts "flip flop true: #{line}" else puts "flip flop false: #{line}" end end __END__ foo bar start inside blah this is the end baz