2011-11-15 12 views
5

Durante la navigazione in CPAN, mi sono imbattuto in un blocco di codice in this module che mi ha bloccato.Perché utilizzare un blocco "do {} if" in Perl?

sub import { 
    for my $mod (keys %INC) { 
    do { 
     delete $INC{$mod}; 
     $mod =~ s/\.pm$//; $mod =~ s/\//::/g; 
     delete_package($mod); 
    } if $mod =~ m/^SOAP/; 
    } 
} 

Perché sarebbe l'autore utilizzare un blocco do {} if al posto di un normale if blocco?

+6

Spazio dei nomi Acme. Perché ti aspetti la sanità mentale? :) – Hugmeir

+4

Personalmente userò 'per il mio $ mod (keys% INC) {next if $ mod! ~/^ SOAP /; ...} '. Specifica i criteri per il ciclo in primo piano ed evita un livello di rientro come bonus. – ikegami

+0

@Hugmeir haha ​​- questa è una risposta perfettamente valida, dovresti inviarla :) –

risposta

4

Perché ne hanno voglia. Non c'è una vera differenza. Perl ha una dozzina di modi per fare tutto. È solo il modo in cui è la lingua.

+1

+1 Mi piace sempre sentire "perché no?". – fncomp

1

Perché in perl "C'è più di un modo per farlo"

2

A me, sembra un modo per sottolineare il codice all'interno più if rispetto alla condizione if stesso.

2

L'autore ha voluto utilizzare if se alla fine, ma deve essere alla fine di una dichiarazione non molti. Un do {} è una dichiarazione, quindi funzionerà.

Personalmente, vorrei usare un'istruzione if, ma è una questione di gusti se l'enfasi dovrebbe essere sull'azione o sulla condizione. In questo caso l'autore ha scelto di sottolineare l'azione.

+0

(+1) Trovo molto confuso scrivere "Fai qualcosa se qualcos'altro", come dire "Sto a casa ** tutti i giorni ** (a meno che non sia un giorno lavorativo)" " – Gonen

5

Una differenza è che do { ... } restituisce un valore, mentre l'istruzione if non (anche se vedere i commenti qui sotto.)

Esempio:

my $x = 3; 
my $z = do { warn "in the do block"; 10 } if $x == 3; 

Si può realizzare quasi la stessa cosa con il ternario operatore, sebbene non sia possibile eseguire istruzioni di sequenza all'interno dei rami dell'operatore ternario.

+2

se le dichiarazioni fanno troppo ritorno valori. Non puoi assegnarli direttamente perché la sintassi è un po 'complicata. Ma se lo si incorpora correttamente, si può vedere che l'if sta restituendo un valore. Ecco una parte di codice equivalente: 'my $ z = do {if ($ x == 3) {warn" nel blocco do "; 10}}' Il tuo codice è più succinto, quindi, quindi penso ancora che sia una risposta ragionevole, solo non del tutto tecnicamente corretta. –

+0

Sono d'accordo: questo è un modo più corretto di guardare la situazione. – ErikR

+0

Questi due esempi sono identici a Perl .... –

Problemi correlati