2009-10-28 23 views
5

No creo que el siguiente debería funcionar, pero lo hace:¿El operador de diamante Perl itera sobre matrices que no son mágicas (no @ARGV)?

$ perl -e '@a = qw/1222 2 3/; while (<@a>) { print $_ ."\n";}' 
1222 
2 
3 
$ 

Por lo que yo sé, el operador de Perl <> shoud trabajar en gestor de archivo, globos y así sucesivamente, con la excepción del literal <> (en lugar de <FILEHANDLE>), que mágicamente itera sobre @ARGV.

¿Alguien sabe si se supone que funciona también como lo hizo en mi prueba?

+0

De perlop (1) alrededor de <> y @ARGV: allí es como funciona: se evalúa la primera vez <>, se comprueba la matriz @ARGV, y si está vacío, [0] se establece en $ ARGV a "-", que cuando se abre le da una entrada estándar. La matriz @ARGV se procesa como una lista de nombres de archivos. Veo que algo similar sucede con mi @a, aunque no parece que eso deba suceder con cada matriz (y sé que el foreach o el mapa son mejores formas de procesar las matrices). Todavía me gustaría saber por qué sin meterme en el código –

Respuesta

10

Magia en el trabajo!

De 'perldoc perlop':

Si lo que hay dentro de los paréntesis angulares es ni un gestor de archivo, ni un simple variable escalar que contiene un nombre de gestor de archivo, typeglob, o referencia typeglob, se interpretado como un patrón de nombres estar globbed, y se devuelve una lista de nombres de archivo o el siguiente nombre de archivo en la lista, , según el contexto.

Esta es la regla que está activando con este código. Esto es lo que sucede:

  1. < @a> es (sintácticamente, en tiempo de compilación) determinó que una expansión glob
  2. tanto <> convierte @a en la cadena "1222 2 3" (cadena de interpolación de una matriz)
  3. glob ("1222 2 3") en los retornos lista de contexto ('1222', '2', '3')
+0

OK, así que me levanté, pero simplemente no obtengo el n. ° 3. – innaM

+0

El comportamiento es: a menos que haya metacaracteres que coincidan con los patrones en su argumento, glob no se molesta en ir al sistema de archivos. Esto puede ser sorprendente. Me ayuda a pensar en términos de la funcionalidad de shell glob, que el globo de Perl pretende emular: si dices 'cat foo', el shell invoca 'cat' con un argumento de 'foo', independientemente de si 'foo' existe Si dices 'cat foo. *', El intérprete de comandos llamará 'cat' con argumentos variables, dependiendo de qué (si hay algo) coincida con el patrón. – dlowe

+0

¡Gracias! Ahora lo entiendo. – innaM

-1

<FH> no es el nombre de un manejador de archivos, sino un operador de ángulo que realiza una operación de entrada de línea en el manejador. Esta confusión se manifiesta generalmente cuando la gente trata de imprimir al operador ángulo" - Programming Perl

Así que en su caso la matriz es un mango, lo cual tiene sentido, y por lo tanto se repite el operador sobre ella Así, en respuesta a su. pregunta, sí, creo que esto es estándar (pero oscuro) Perl. Es oscuro porque el lenguaje tiene formas más obvias de iterar en una matriz.

PD Sin embargo, gracias por esto, esto será genial para las competiciones de código de golf

+0

No publique enlaces a copias no autorizadas de libros. –

+0

Vaya, ni siquiera me di cuenta.Perdón por eso. –

+1

foreach (@a) es tan corto y fácil como while (<@a>), por lo que no ayuda mucho en el código de golf. –

1

Esto está invocando glob.

Cuestiones relacionadas