sam*_*uil 14 ruby regex language-agnostic perl flip-flop
我最近听说过有关Perl和Ruby中带有正则表达式的触发器,但是我无法找到它们是如何工作的以及常见的用例.
任何人都可以用与语言无关的方式解释这一点吗?
现在我明白了它是什么,以及它是如何工作的,我将这个问题简单地改为:什么是触发器操作符?
小智 14
当左操作数为真时,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
Run Code Online (Sandbox Code Playgroud)
对于从start
直到的所有行,触发器操作符都是真的this is the end
.
运算符的双点版本允许第一个和第二个正则表达式在同一行上匹配.因此,如果您的数据看起来像这样,上述程序只适用于该行start blah end
:
foo
bar
start blah end
inside
blah
this is the end
baz
Run Code Online (Sandbox Code Playgroud)
如果您不希望第一个和第二个正则表达式匹配同一行,则可以使用三点版本:if (/start/ ... /end/)
.
请注意,应注意不要将触发器操作符与范围操作符混淆.在列表上下文中,..
具有完全不同的功能:它返回顺序值列表.例如
my @integers = 1 .. 1000; #makes an array of integers from 1 to 1000.
Run Code Online (Sandbox Code Playgroud)
我不熟悉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
Run Code Online (Sandbox Code Playgroud)
更惯用的红宝石:
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
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
3738 次 |
最近记录: |