2011-11-15 9 views
5

Al navegar por CPAN, encontré un bloque de código en this module que me dejó perplejo.¿Por qué usar un bloque "do {} if" en 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/; 
    } 
} 

¿Por qué el autor utilice un bloque do {} if en lugar de un bloque regular de if?

+6

Espacio de nombres Acme. ¿Por qué esperas cordura? :) – Hugmeir

+4

Yo personalmente usaría 'para mi $ mod (claves% INC) {siguiente si $ mod! ~/^ SOAP /; ...} '. Especifica los criterios para el bucle por adelantado y evita un nivel de sangrado como bonificación. – ikegami

+0

@Hugmeir jaja - esa es una respuesta perfectamente válida, debe enviarla :) –

Respuesta

4

Porque les da la gana. No hay diferencia real. Perl tiene una docena de maneras de hacer todo. Así es el lenguaje.

+1

+1 Siempre me gusta escuchar "¿por qué no?". – fncomp

1

Debido a que en Perl "Hay más de una manera de hacerlo"

2

Para mí, parece como una forma de enfatizar el código dentro la if más de la condición if sí.

2

El autor quería utilizar el if al final, pero tiene que estar al final de una declaración no muchas. Un do {} es una declaración, por lo que funcionará.

Personalmente, utilizaría una declaración if, pero es una cuestión de gusto si el énfasis debe estar en la acción o la condición. En este caso, el autor eligió enfatizar la acción.

+0

(+1) Me resulta muy confuso escribir "Hacer algo si es algo diferente", como decir "_Me quedo en casa ** todos los días ** (a menos que sea un día de trabajo) _" – Gonen

5

Una diferencia es que do { ... } devuelve un valor, mientras que una sentencia if no (aunque vea los comentarios a continuación.)

Ej:

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

Usted puede lograr casi lo mismo con el ternario operador, aunque no puede secuenciar declaraciones dentro de las ramas del operador ternario.

+2

si las declaraciones también lo hacen valores. Simplemente no puedes asignarlos directamente debido a que la sintaxis es un poco complicada. Pero si lo inserta correctamente, puede ver que el if devuelve un valor. Aquí hay una pieza equivalente de código: 'my $ z = do {if ($ x == 3) {warn" en el bloque do "; 10}}' Su código es más sucinto, así que sigo pensando que es una respuesta razonable, simplemente no del todo técnicamente correcta. –

+0

Estoy de acuerdo, esa es una forma más correcta de ver la situación. – ErikR

+0

Esos dos ejemplos son idénticos a Perl .... –

Cuestiones relacionadas