2010-02-16 14 views

risposta

2

Si otterrebbe un avviso se si ridichiarare una variabile my, our o state nel campo di applicazione o istruzione corrente. Il primo $i non è in realtà una variabile lessicale. È possibile dimostrare questo usando Devel::Peek:

use Devel::Peek; 

for my $i (1) { 
    Dump $i; 
} 

SV = IV(0x81178c8) at 0x8100bf8 
REFCNT = 2 
FLAGS = (IOK,READONLY,pIOK) 
IV = 1 

Non c'è PADMY bandiera in bandiere, che indicherebbe che $i è una variabile lessicale, dichiarata con my.

9

In realtà, si ricevono solo avvisi per le ridefinizioni nello stesso ambito. Scrivi:

use warnings; 
my $i; 
{ 
    my $i; 
    # do something to the inner $i 
} 
# do something to the outer $i 

è perfettamente valido.

io non sono sicuro se la struttura interna di Perl gestire in questo modo, ma si può pensare della vostra for ciclo ad essere analizzato come

{ 
    my $i; 
    for $i (...) { ... } 
    # the outer scope-block parens are important! 
};
+0

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

+0

sono entrambi nello stesso ambito del blocco for mentre i tuoi esempi sono entrambi in ambiti diversi. –

+0

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

Problemi correlati