我已經聽說過最近在Perl和Ruby中使用正則表達式的觸發器,但我無法找到它們的工作原理以及常見用例。什麼是觸發器操作符?
任何人都可以解釋這與語言不可知的方式?
現在我明白了它是什麼以及它是如何工作的,我將這個問題改爲簡單:什麼是觸發器操作符?
我已經聽說過最近在Perl和Ruby中使用正則表達式的觸發器,但我無法找到它們的工作原理以及常見用例。什麼是觸發器操作符?
任何人都可以解釋這與語言不可知的方式?
現在我明白了它是什麼以及它是如何工作的,我將這個問題改爲簡單:什麼是觸發器操作符?
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表明它的工作原理類似。
紅寶石:https://gist.github.com/baa007793b683ce3c5ca –
下面是@ 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
很酷,剛剛閱讀關於觸發器運算符有一天,當檢查出perl,很高興知道紅寶石(我去腳本語言)它也有它 –
爲什麼每個「行」打印,而不是觸發器字符串? – onebree
你頗具意味的正則表達式拖鞋? – choroba
是的,這就是我應該問的:) – samuil