2011-11-15 14 views
5

Podczas przeglądania CPAN natknąłem się na blok kodu w this module, który mnie zaskoczył.Dlaczego warto używać bloku "do {} jeśli" w Perlu?

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

Dlaczego autor użyć do {} if bloku zamiast regularnej if bloku?

+6

Acme namespace. Dlaczego oczekujesz zdrowego rozsądku? :) – Hugmeir

+4

Osobiście użyłbym 'for my $ mod (keys% INC) {next if $ mod! ~/^ SOAP /; ...} '. Określa kryteria pętli z góry i unika poziomu wcięcia jako premii. – ikegami

+0

@Hugmeir haha ​​- to jest całkowicie poprawna odpowiedź, powinieneś ją przesłać :) –

Odpowiedz

4

Bo im się podoba. Nie ma prawdziwej różnicy. Perl ma aż tuzin sposobów na zrobienie wszystkiego. Tak po prostu jest język.

+1

+1 Zawsze lubię słuchać "dlaczego nie?". – fncomp

1

Ponieważ w Perl „Jest więcej niż jeden sposób, aby to zrobić”

2

Dla mnie wydaje się sposób, aby podkreślić kod wewnątrz bardziej niż sam stan ifif.

2

Autor chciał użyć, jeśli na końcu, ale musi być na końcu jednego zdania niewiele. A do {} jest jednym stwierdzeniem, więc to zadziała.

Osobiście użyłbym instrukcji if, ale to kwestia gustu, czy nacisk powinien być na akcję, czy stan. W tym przypadku autor postanowił podkreślić akcję.

+0

(+1) Uważam, że pisanie "Zrób coś, jeśli coś innego" jest dla mnie bardzo mylące, tak jak mówię: "Zatrzymuję się w domu ** każdego dnia ** (chyba że jest to dzień roboczy) _" – Gonen

5

Jedną z różnic jest to, że do { ... } zwraca wartość podczas gdy if nie (chociaż zobaczyć komentarze poniżej).

np

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

można osiągnąć prawie to samo z trójskładnikowego operator, chociaż nie można sekwencyjnie wprowadzać instrukcji wewnątrz gałęzi operatora trójskładnikowego.

+2

jeśli zwroty są zbyt powracające wartości. Po prostu nie możesz ich przypisać bezpośrednio, ponieważ składnia jest trochę trudna. Ale jeśli umieścisz go poprawnie, zobaczysz, że jeśli zwraca wartość. Oto odpowiednik kodu: 'my $ z = do {if ($ x == 3) {warn" w bloku do "; 10}}' Twój kod jest jednak bardziej zwięzły, więc nadal uważam, że jest rozsądna odpowiedź, po prostu nie do końca poprawna pod względem technicznym. –

+0

Zgadzam się - to bardziej poprawny sposób patrzenia na sytuację. – ErikR

+0

Te dwa przykłady są identyczne z Perl .... –

Powiązane problemy