2011-06-08 15 views
18

Recientemente me encontré con el siguiente fragmento de código¿Dónde se documenta la sintaxis postfix `for` de Perl?

$count_stuff{$_}++ for @stuff; 

Es una forma muy conveniente utilizar un hash para contar las apariciones de cadenas en una matriz, por ejemplo. Entiendo cómo funciona, pero no por qué funciona. No puedo encontrar la documentación para esta forma de usar para.

¿Por qué funciona? ¿Y dónde está la documentación?

+0

Probablemente por la misma razón que se puede usar 'if',' while', o 'a menos 'después de una declaración. –

+0

Gracias. Como puede ver, soy un novato de Perl, pero la metaetiqueta [de principiante] se eliminó. –

+3

Existe cierta ambigüedad entre los perldocs 'perlfunc'' perlop' y 'perlsyn', pero entre estos tres se puede encontrar casi cualquier cosa. nótese bien 'perlfunc' se puede buscar con el modificador de línea de comando' -f' como en 'perldoc -f opendir'. –

Respuesta

19

Está documentado en la página del manual "perlsyn", bajo Statement Modifiers (que habla sobre la sintaxis de sufijo) y bajo Foreach Loops (lo que explica que "para" y "foreach" son sinónimos).

0

Me parece el estándar Perl for. Toma cada elemento y ejecuta el cuerpo (en este caso es anterior) con $_ sustituido con cada elemento. Es solo una sintaxis alternativa para: for (@array) { statements }

3

Perl tiene variantes de postfix para muchas de sus declaraciones. Simplemente se escribe la palabra clave después del cuerpo de una sola declaración.

Puede usar if, unless, etc. de la misma manera.

0

Según this page misma están documentadas here
y debería leerlos Foreach Loops para obtener respuesta a su pregunta.

En resumen, si usted entiende esto muy bien:

for my $item (@array) { print $item } 

Y sabe sintaxis del for y print:

LABEL for VAR (LIST) BLOCK 
print LIST 

De acuerdo con el documento de foreach: If VAR is omitted, $_ is set to each value.
Y de acuerdo con la doc de print: If LIST is omitted, prints $_

Así podemos reducir el ejemplo anterior:

for (@array) { print } 

En la forma de sufijo que se verá así:

print for @array; 
Cuestiones relacionadas