¿Por qué no se emite una advertencia para la redeclaración de $i
en el siguiente código?¿Por qué no aparece una advertencia cuando redeclaro la variable de control de Perl foreach?
#!/usr/bin/perl
use strict;
use warnings;
use Data::Dumper;
for my $i (1..3) {
my $i = 'DUMMY';
print Dumper $i;
}
Su segundo ejemplo no es en absoluto lo mismo que la primera, debido a la diferente alcance, así como el iterador de bucle con alias a los elementos de la matriz (lo que significa que si cambia $ i dentro del bucle, cambiará su matriz, o generará una advertencia si los elementos son constantes). – Ether
ambos están dentro del mismo alcance del bloque for mientras que sus ejemplos están en diferentes ámbitos. –
El aliasing en el segundo ejemplo funciona como se espera, pruébelo usted mismo: my @a = (1 .. 3); {mi $ i; por $ i (1 .. 3) {$ i = 'x'; }} print "a: @a"; En cuanto a estar en el mismo ámbito: como muestra la pregunta, la declaración en la expresión para claramente no está en el mismo alcance que la declaración en el bloque interno. – willert