2010-03-11 10 views
6

que he encontrado en un módulo de un ciclo for escribe asíPregunta acerca del foreach valor

for(@array) { 
    my $scalar = $_; 
    ... 
    ... 
} 

¿Hay diferencia entre esta y la siguiente manera de escribir un bucle de?

for my $scalar (@array) { 
    ... 
    ... 
} 

Respuesta

11

Sí, en el primer ejemplo, el bucle for está actuando como un topicalizer (ajuste $_ que es el argumento por defecto para muchas funciones Perl) a lo largo los elementos en la matriz. Esto tiene el efecto secundario de enmascarar el valor que $_ tenía fuera del lazo for. $_ tiene un alcance dinámico, y será visible en cualquier función llamada dentro del lazo for. Debería utilizar principalmente esta versión del bucle for cuando planea usar $_ para sus funciones especiales.

También, en el primer ejemplo, $scalar es una copia del valor en la matriz, mientras que en el segundo ejemplo, $scalar es un alias para el valor en la matriz. Esto importa si planea establecer el valor de la matriz dentro del ciclo. O, como lo señala útilmente, el primer formulario es útil cuando necesita una copia del elemento de matriz para trabajar, como por ejemplo, llamadas a funciones destructivas (chomp, s///, tr/// ...).

Y, por último, el primer ejemplo será un poco más lento.

+0

Buena respuesta, ++. Sin embargo, no estoy de acuerdo en que 'for (@array) {}' solo se use si va a operar principalmente en '$ _'. El hecho de que la primera versión fuerce una copia es beneficioso si planea cambiar el valor de '$ escalar'. No hay ninguna razón para escribir 'para mi $ alias (@array) {mi $ escalar = $ alias; ...} '. Esto en un uso particularmente válido de la forma tópica del bucle for. – daotoad

+0

@daotoad => Acepto, respondo actualizado, gracias por captar eso –

3

$_ es el "espacio de coincidencia de patrón y entrada predeterminado". En otras palabras, si lee desde un identificador de archivo en la parte superior de un ciclo while, o ejecuta un ciclo foreach y no nombra una variable de ciclo, $_ está configurado para usted.

Sin embargo, si se escribe un bucle foreach y nombrar una variable de bucle, $ _ ajustado no up.This puede ser justificado por código siguiente:

1. #!/usr/bin/perl -w 
2. @array = (1,2,3); 
3. foreach my $elmnt (@array) 
4. { 
5. print "$_ "; 
6. } 

La salida es "Uso del valor no inicializado en la concatenación (.)"

Sin embargo si se reemplaza la línea 3 por:

foreach (@array) 

La salida es "1 2 3" como se esperaba.

Ahora en su caso, siempre es mejor nombrar una variable de bucle en un bucle foreach para hacer que el código sea más legible (perl ya está maldito por ser menos legible), de esta manera tampoco será necesario asignación a la variable $_ y problemas de alcance resultantes.

Cuestiones relacionadas