18

我最近在 Perl 和 Ruby 中听到并阅读了有关使用正则表达式的触发器,但我无法找到它们的真正工作原理以及常见用例是什么。

谁能以与语言无关的方式解释这一点?

现在我了解了它是什么以及它是如何工作的,我将把这个问题改写成简单的:什么是触发器运算符?

4

2 回答 2

17

Perl 中的触发器运算符在左操作数为真时计算为真,并一直计算为真,直到右操作数为真。左右操作数可以是任何类型的表达式,但最常与正则表达式一起使用。

使用正则表达式,可用于查找两个标记之间的所有行。这是一个简单的例子,展示了它是如何工作的:

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

触发器运算符将适用于从startuntil的所有行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 的链接表明它的工作方式类似。

于 2013-01-22T12:29:32.917 回答
8

这是@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
于 2013-01-22T20:51:41.503 回答