我已经听说过最近在Perl和Ruby中使用正则表达式的触发器,但我无法找到它们的工作原理以及常见用例。什么是触发器操作符?
任何人都可以解释这与语言不可知的方式?
现在我明白了它是什么以及它是如何工作的,我将这个问题改为简单:什么是触发器操作符?
我已经听说过最近在Perl和Ruby中使用正则表达式的触发器,但我无法找到它们的工作原理以及常见用例。什么是触发器操作符?
任何人都可以解释这与语言不可知的方式?
现在我明白了它是什么以及它是如何工作的,我将这个问题改为简单:什么是触发器操作符?
Perl中的触发器运算符在左操作数为true时计算为true,并且一直保持计算结果为true,直到右操作数为true。左边和右边的操作数可以是任何类型的表达式,但大多数情况下它与正则表达式一起使用。
使用正则表达式,它对查找两个标记之间的所有行非常有用。下面是一个简单的例子,说明它是如何工作的:
use Modern::Perl;
while (<DATA>)
{
if (/start/ .. /end/)
{
say "flip flop true: $_";
}
else
{
say "flip flop false: $_";
}
}
__DATA__
foo
bar
start
inside
blah
this is the end
baz
触发器运营商将适用于所有线路从start
直到this is the end
。
运算符的双点版本允许第一个和第二个正则表达式匹配同一行。
foo
bar
start blah end
inside
blah
this is the end
baz
如果你不想在第一和第二正则表达式匹配的同一行,你可以使用三:所以,如果你的数据看起来像这样,上述计划将只对线start blah end
是真实的dot版本:if (/start/ ... /end/)
。
请注意,不要将触发器操作符与范围操作符混淆。在列表上下文中,..
具有完全不同的功能:它返回一个连续值列表。例如
my @integers = 1 .. 1000; #makes an array of integers from 1 to 1000.
我不熟悉Ruby,但Lee Jarvis's link表明它的工作原理类似。
红宝石:https://gist.github.com/baa007793b683ce3c5ca –
下面是@ dan1111的演示的直接红宝石翻译(图示了红宝石偷走了超过从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
更地道的红宝石:
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
很酷,刚刚阅读关于触发器运算符有一天,当检查出perl,很高兴知道红宝石(我去脚本语言)它也有它 –
为什么每个“行”打印,而不是触发器字符串? – onebree
你颇具意味的正则表达式拖鞋? – choroba
是的,这就是我应该问的:) – samuil