Perché non viene lanciato alcun avviso per la ridichiarazione di $i
nel seguente codice?Perché non viene visualizzato un avviso quando redeclare la variabile di controllo Pereach Foreach?
#!/usr/bin/perl
use strict;
use warnings;
use Data::Dumper;
for my $i (1..3) {
my $i = 'DUMMY';
print Dumper $i;
}
Il tuo secondo esempio non è affatto la stessa della prima, a causa della scope differente, così come l'iteratore di loop essendo aliasato agli elementi dell'array (nel senso che se si modifica $ i all'interno del ciclo, si cambierà l'array o si genererà un avviso se gli elementi sono costanti). – Ether
sono entrambi nello stesso ambito del blocco for mentre i tuoi esempi sono entrambi in ambiti diversi. –
L'alias nel secondo esempio funziona come previsto, provalo tu stesso: my @a = (1 .. 3); {my $ i; per $ i (1 .. 3) {$ i = 'x'; }} stampa "a: @a"; Per essere nello stesso ambito: come mostra la domanda, la dichiarazione nell'espressione for non è chiaramente nello stesso ambito della dichiarazione nel blocco interno. – willert