我已经听到和读到的触发器与Perl和Ruby的正则表达式最近,但我无法找到他们到底是如何工作的,什么常见的用例。
任何人都可以在一个语言无关的方式解释一下吗?
现在我才明白它是什么,它是如何工作的,我想改写这个问题是简单的:什么是一个触发器操作?
我已经听到和读到的触发器与Perl和Ruby的正则表达式最近,但我无法找到他们到底是如何工作的,什么常见的用例。
任何人都可以在一个语言无关的方式解释一下吗?
现在我才明白它是什么,它是如何工作的,我想改写这个问题是简单的:什么是一个触发器操作?
Perl中的触发器操作结果为真当左操作数是真实的,并不断评估为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.
我不熟悉的红宝石,但李·贾维斯的链接表明,它的工作原理类似。
下面是@ 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