2013-01-22 12 views
14

最近PerlやRubyで正規表現のフリップフロップについて聞いたことがありますが、実際にどのように動作しているのか、どのような一般的なケースがあるのか​​分かりませんでした。フリップフロップ演算子とは何ですか?

これは誰でも言語に依存しない方法で説明できますか?

私はそれが何であり、どのように機能しているのか分かりましたので、単純に質問を言い換えると、フリップフロップ演算子とは何ですか?

+1

あなたは、むしろで正規表現を意味しますかフリップ·フロップ? – choroba

+0

ええ、それは私が本当に尋ねる必要があります:) – samuil

答えて

12

Perlのフリップフロップ演算子は、左側のオペランドがtrueのときにtrueを評価し、右側のオペランドがtrueになるまで評価を続けます。左と右のオペランドはどんな種類の式でもかまいませんが、ほとんどの場合、正規表現で使用されます。

正規表現を使用すると、2つのマーカー間のすべての線を見つけるのに便利です。ここではそれがどのように動作するかを示す簡単な例です:

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 

フリップ・フロップのオペレータがthis is the endまでstartからのすべての行に対して真となります。

演算子の2ドットバージョンでは、1行目と2行目の正規表現を同じ行に一致させることができます。あなたのデータは、このように見えたのであれば、上記のプログラムは、ラインstart blah endのために真のようになります。

foo 
bar 
start blah end 
inside 
blah 
this is the end 
baz 

あなたが同じラインに合わせて、第一及び第二の正規表現をしたくない場合は、次の3つを使用することができますドットバージョン: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

は(RubyはPerlのからflip_flop以上のものを盗んだことを示す)の@ dan1111のデモの直接Rubyの翻訳です:

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

フリップフロップの文字列ではなく、それぞれの 'line'がなぜ出力されたのですか? – onebree

関連する問題