我最近听说并读到了Perl和Ruby中带有正则表达式的人字拖,但我无法找到它们的实际工作原理以及常见的用例是什么。
谁能以与语言无关的方式解释这一点?
现在我了解了它是什么,以及它是如何工作的,我将问题改写为简单:什么是触发器运算符?
Perl 中的触发器运算符在左操作数为真时计算为 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
的所有行都为真。
运算符的两点版本允许第一个和第二个正则表达式在同一行上匹配。因此,如果您的数据如下所示,则上述程序仅适用于行start blah end
:
foo
bar
start blah end
inside
blah
this is the end
baz
如果您不希望第一个和第二个正则表达式匹配同一行,则可以使用三点版本:if (/start/ ... /end/)
。
请注意,应注意不要将触发器运算符与范围运算符混淆。 在列表上下文中,..
有一个完全不同的函数:它返回一个顺序值的列表。 例如
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
更惯用的红宝石:
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