unless sentencia programas perl syntax foreach

perl - sentencia - Expresión concisa del foreach en una línea



sentencia perl (8)

Bueno, puede que no tengas la intención de escribir un código ofuscado, pero diría que ciertamente lo intentas .

¿Serían tan malas dos líneas (o incluso un bloque en una línea, como sugiere Brent.Longborough) en lugar de una? Honestamente, esta es la razón por la que generalmente odio intentar depurar / editar el código perl de otras personas, un gran número de personas que escriben en perl parecen estar obsesionadas con hacer casi todo de la manera más "inteligente" posible, en lugar de hacerlo de una manera que sea fácil de entender para otra persona leyendo.

En Perl, a menudo se puede evitar el uso de bloques de control, como este:

print "$_/n" foreach(@files);

en lugar de:

foreach(@files){ print "$_/n"; }

¿Cómo funciona esta sintaxis en el siguiente caso, más complejo?

die("Not a file: $_") unless -f $_ foreach(@files);

Me da un error de sintaxis No estoy tratando de escribir código ofuscado, es solo una parte sin importancia en el programa, por lo que quiero expresarlo de la manera más concisa posible.

RESPUESTAS RESUMIDAS:

Solo puedo aceptar una respuesta como respuesta aceptada, pero me gustan las siguientes de Chris y Jon.

Este usa foreach como lo pretendía, pero sin el syntax error :

-f or die "Not a file: $_" foreach @files;

Y el siguiente es al menos tan bueno. Me gusta que el die esté al principio de la declaración porque a eso es a lo que debe dirigirse la atención del lector:

die("Not a file: $_") for grep {!-f} @files;


Maldita sea, Jon solo me ganó a grep .

Pero tengo una pregunta más amplia: ¿cómo no es importante si en realidad va a rescatar si encuentra algunos archivos que no son de su matriz? (A diferencia de, por ejemplo, eliminar esos elementos, advertir al usuario y luego procesar el resto de la lista.) Creo que matar a todo el shebang es una parte razonablemente importante del programa.

En cualquier caso, no puede hacer exactamente lo que quiere con los modificadores de postfix ya que solo puede tener una cosa en cada lado de ellos. Entonces no puedes tener ambos, el unless y el foreach . Desde la parte superior del perldoc perlsyn :

Cualquier enunciado simple puede ser seguido opcionalmente por un modificador SINGLE , justo antes del punto y coma final (o final del bloque).


Para ser Perlish (TMTOWTDI) puede usar el cortocircuito lógico:

-f or die "Not a file: $_" foreach @files;

Probado en OS X y funciona.

Como nota al margen, " -f or die parece una gran cantidad de construcciones open() or die que veo en Perl, y aún así (creo) muestra la intención de la línea ( die bajo ciertas condiciones).


Si la prueba de error es el punto principal de este código, podría tener sentido que tenga la ubicación principal al principio de la línea. Una ligera mejora sería usar grep :

die("Not a file: $_") for grep {!-f} @files;

Pero si planea recorrer los archivos por algún otro motivo en esa parte del código, sería mejor agregarlo al cuerpo del bucle.


Si no está tratando de escribir un código ofuscado, entonces no debería tratar de escribirlo así. Está tomando algo que debería ser simple y dificultar su comprensión.



Puedes usar la respuesta de @ Brent.Longborough, o si realmente quieres postfix, hazlo:

do { die("Not a file: $_") unless -f $_ } foreach(@files);

Sin embargo, estoy de acuerdo con los demás, el hecho de que esto sea "una parte sin importancia" no significa que la concisión sea mejor. La legibilidad cuenta


Estás pensando demasiado. Aquí está en una línea sin acrobacias:

foreach ( @files ) { die( "Not a file!" ) unless -f }

Puede jugar con las cosas dentro del bloque para jugar golf, pero quitar los paréntesis y las llaves no le ayuda, y probablemente confundirá al próximo programador que tenga que mirarlo.

Sin embargo, probablemente tengas algo más complicado, y esto es solo un ejemplo. En el mundo real, es aún más fácil:

not_a_file_die_die_die( /@files );

A continuación, mueve todas las cosas complicadas a una subrutina. El verdadero truco es hacer que la idea y la intención sean concisas, no el código que implementa la idea. La mecánica realmente no importa en muchos casos; te importa más el resultado En esos casos, no te preocupes por la mecánica.