2013-01-22 59 views
14

我已经听说过最近在Perl和Ruby中使用正则表达式的触发器,但我无法找到它们的工作原理以及常见用例。什么是触发器操作符?

任何人都可以解释这与语言不可知的方式?

现在我明白了它是什么以及它是如何工作的,我将这个问题改为简单:什么是触发器操作符?

+1

你颇具意味的正则表达式拖鞋? – choroba

+0

是的,这就是我应该问的:) – samuil

回答

12

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表明它的工作原理类似。

+1

红宝石:https://gist.github.com/baa007793b683ce3c5ca –

7

下面是@ 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 
+0

很酷,刚刚阅读关于触发器运算符有一天,当检查出perl,很高兴知道红宝石(我去脚本语言)它也有它 –

+0

为什么每个“行”打印,而不是触发器字符串? – onebree