18

最近、Perl と Ruby で正規表現を使用したフリップフロップについて聞いたり読んだりしましたが、それらが実際にどのように機能し、一般的なユース ケースが何であるかを見つけることができませんでした。

言語にとらわれない方法でこれを説明できる人はいますか?

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

4

2 に答える 2

17

Perl のフリップフロップ演算子は、左のオペランドが真の場合に真と評価され、右のオペランドが真になるまで真と評価され続けます。左オペランドと右オペランドは任意の種類の式にすることができますが、ほとんどの場合、正規表現と共に使用されます。

正規表現を使用すると、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

フリップフロップ演算子は、 からstartまでのすべての行に対して true になりますthis is the end

演算子の 2 つのドット バージョンでは、最初と 2 番目の正規表現を同じ行で一致させることができます。したがって、データが次のようになっている場合、上記のプログラムは次の行にのみ当てはまりますstart blah end

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

最初と 2 番目の正規表現を同じ行に一致させたくない場合は、3 つのドット バージョンを使用できます: if (/start/ ... /end/).

フリップフロップ演算子と範囲演算子を混同しないように注意してください。リスト コンテキストで..は、まったく異なる機能があります。連続した値のリストを返します。例えば

my @integers = 1 .. 1000; #makes an array of integers from 1 to 1000. 

私は Ruby に詳しくありませんが、Lee Jarvis のリンクは、Rubyも同様に機能することを示唆しています。

于 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 に答える