2013-01-22 13 views
14

Perl ve Ruby'de düzenli ifadeleri olan flip-flop'ları yeni duydum ve okudum, ancak gerçekten nasıl çalıştığını ve yaygın kullanım durumlarının neler olduğunu bulamadım.Bir flip-flop operatörü nedir?

Bunu açıklayıcı bir şekilde açıklayabilir mi?

Şimdi bunun ne olduğunu ve nasıl çalıştığını anladığımı anladığım kadarıyla bu sorunun basitçe yeniden yorumlanmasını isterim: Flip-flop operatörü nedir?

+1

rezervasyon yapmaya İfadelerinin ifade ediyor İşte – choroba

+0

Evet, gerçekten sormam gereken şey budur :) – samuil

cevap

12

Perl'teki flip-flop işleci, sol işlenen doğru olduğunda true olarak değerlendirir ve sağ işleneni doğru olana kadar doğruyu değerlendirmeye devam eder. Sol ve sağ işlenen herhangi bir ifade olabilir, ancak çoğu zaman regex ile kullanılır.

Normal ifadelerle, iki işaretçi arasındaki tüm satırları bulmak yararlıdır. Şu şekilde çalışır gösteren basit bir örnek:

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 

Flip flop operatörü start den this is the end kadar bütün hatlar için geçerli olacak.

Operatörün iki nokta sürümü, her ikisi de aynı satırda eşleşecek birinci ve ikinci normal ifadelere izin verir. Aynı çizgiyi maç için birinci ve ikinci Regexes istemiyorsanız

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

, üçümüzü kullanabilirsiniz: Veri böyle görünüyordu Yani, eğer yukarıdaki program sadece hat start blah end için de geçerli olacağı nokta sürümü: if (/start/ ... /end/).

Flip-flop operatörünü mesafe operatörü ile karıştırmamak için dikkatli olunmalıdır. Liste bağlamında, .. tamamen farklı bir işlevi vardır: bir sıralı değer listesi döndürür. Örneğin.

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

Ben Ruby aşina değilim, ama Lee Jarvis's link o benzer şekilde çalışır düşündürmektedir.

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 

Daha deyimsel yakut:

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 
+1

Ruby: https://gist.github.com/baa007793b683ce3c5ca –

7

@ dan1111 en demo doğrudan Ruby çeviri (Yakut fazla Perl gelen flip_flop daha çaldığını gösteren) olan takla?
+0

cool, sadece bir gün, flip-flop operatörünü okuyarak, perl'i kontrol ederken, o yakutu bilmek güzel Benim yazı diline gitmem de) –

+0

'a sahip. Neden herbir satır "flip-flop" dizgisi yerine basılıyor? – onebree