2013-01-22 17 views
14

Ho sentito e letto di infradito con espressioni regolari in Perl e Ruby di recente, ma non sono stato in grado di scoprire come funzionano veramente e quali sono i casi di utilizzo comune.Che cos'è un operatore flip-flop?

Qualcuno può spiegare questo in modo indipendente dal linguaggio?

Ora che ho capito di cosa si tratta, e come funziona, vorrei riformulare la domanda in modo semplice: che cos'è un operatore flip-flop?

+1

Ti piuttosto dire espressioni regolari in ciabatte infradito? – choroba

+0

Sì, è quello che dovrei davvero chiedere :) – samuil

risposta

12

L'operatore flip-flop in Perl restituisce true quando l'operando sinistro è true e continua a valutare true finché l'operando destro non è true. L'operando di sinistra e di destra potrebbe essere qualsiasi tipo di espressione, ma il più delle volte è usato con espressioni regolari.

Con regex, è utile per trovare tutte le linee tra due indicatori. Ecco un semplice esempio che mostra come funziona:

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 

Il flip flop di operatore sarà vero per tutte le linee di start fino this is the end.

La versione a due punti dell'operatore consente la prima e la seconda regex di entrambe le corrispondenze sulla stessa linea. Così, se i dati si presentava così, il programma di cui sopra sarebbe solo vero per la linea start blah end:

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

Se non si desidera che il primo e secondo regex per abbinare la stessa linea, è possibile utilizzare i tre versione punto: if (/start/ ... /end/).

Si noti che occorre prestare attenzione a non confondere l'operatore flip-flop con l'operatore di intervallo. Nel contesto dell'elenco, .. ha una funzione completamente diversa: restituisce un elenco di valori sequenziali. per esempio.

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

Non ho familiarità con Ruby, ma Lee Jarvis's link suggerisce che funziona in modo simile.

+1

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

7

Qui è una traduzione diretta Rubino di demo @ di dan1111 (dimostrazione del fatto che Rubino ha rubato più del flip_flop da Perl):

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 

Più idiomatica rubino:

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

cool, basta leggere sull'operatore flip-flop l'altro giorno mentre controlla perl, buono a sapere che ruby ​​(Il mio passaggio al linguaggio di scripting) lo ha pure –

+0

Perché ogni 'line' viene stampata, piuttosto che la stringa flip-flop? – onebree