最近PerlやRubyで正規表現のフリップフロップについて聞いたことがありますが、実際にどのように動作しているのか、どのような一般的なケースがあるのか分かりませんでした。フリップフロップ演算子とは何ですか?
これは誰でも言語に依存しない方法で説明できますか?
私はそれが何であり、どのように機能しているのか分かりましたので、単純に質問を言い換えると、フリップフロップ演算子とは何ですか?
最近PerlやRubyで正規表現のフリップフロップについて聞いたことがありますが、実際にどのように動作しているのか、どのような一般的なケースがあるのか分かりませんでした。フリップフロップ演算子とは何ですか?
これは誰でも言語に依存しない方法で説明できますか?
私はそれが何であり、どのように機能しているのか分かりましたので、単純に質問を言い換えると、フリップフロップ演算子とは何ですか?
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は同様に動作することを示しています。ここで
ルビー:https://gist.github.com/baa007793b683ce3c5ca –
は(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
クール、ちょうどフリップフロップオペレータについては、perlをチェックアウトしている間、私のスクリプト言語へ) –
フリップフロップの文字列ではなく、それぞれの 'line'がなぜ出力されたのですか? – onebree
あなたは、むしろで正規表現を意味しますかフリップ·フロップ? – choroba
ええ、それは私が本当に尋ねる必要があります:) – samuil