2011-08-16 16 views
12

¿Es posible utilizar un solo lazo de línea foreach en Perl?¿Es posible escribir un bucle foreach de Perl en una sola línea?

$hash{$thing}++ foreach my $thing (@things); 

Sé que esto es posible con muchos otros comandos tales como,

die "Invalid file!\n" if (open($Handle, "file.txt")); 

sé que la declaración abierta tal vez roto :)

+0

@Zaid: "inline a loop"? Quizás soy solo yo, pero encontré el título anterior más descriptivo ...:/ – musiKk

+0

@musiKk: Revisado. – Zaid

+0

en su segunda declaración: cambie 'if' a' unless' o use la expresión más común (y 3arg open y léxical handle) 'abrir mi $ handle, '<', 'file.txt' o morir" Error al abrir el archivo: $! ";' por supuesto, use ''>'' si desea abrir el archivo para escribir en lugar de leer. –

Respuesta

29

Casi. En el sufijo foreach, debe utilizar $ _:

$hash{$_}++ foreach @things; 

o de manera equivalente (ya for y foreach son alias de sintaxis):

$hash{$_}++ for @things; 
+1

+1 por brevedad y 'por '. –

+0

Me acabo de dar cuenta de que después de haber publicado, pero gracias por la rápida respuesta. Me di cuenta de que las variables nombradas en una sola declaración son un poco exageradas. –

+0

podría señalar, por favor, dónde está documentada esta sintaxis? La página de perlsyn no menciona esto. – user907860

3

que puede hacer:

foreach my $thing (@things) {$hash{$thing}++}; 

si lo quieres en una línea con una variable de ámbito léxico. No puede invertir el foreach y mantener la variable del ámbito del ciclo.

+5

Usted escribió "No puede invertir el' foreach' y mantener la variable del ámbito del ciclo. No con ese nombre, no, pero ¿y qué? Un 'foreach' de una línea no necesita un topicalizador nombrado. '$ hash {$ _} ++ para @ things' dice hash ** it ** para cada cosa, o más en inglés, para hash ** its ** things. Recuerde que '$ _' debería leer como" eso ". Y "it" está * garantizado * como una variable de ámbito de bucle. Además, será una nueva variable privada que tiene un alcance léxico para el bucle ** IFF ** si un léxico existente con ese nombre (léase: '$ _') ya estaba dentro del alcance y, de otro modo, tenía un alcance dinámico. Todavía tiene un alcance de bucle en ambos sentidos. – tchrist

Cuestiones relacionadas