2012-05-18 12 views
10

Nel codice seguente:Non dovrebbe accedere a @Whatever :: cosa produce almeno un avvertimento invece di un array vuoto?

use strict; 
use warnings; 
use Data::Dumper; 

my %hash = %Whatever::whatever; 
my @array = @Whatever::whatever; 
print Dumper \@array; 
print Dumper \%hash; 

mia comprensione è che @Whatever :: qualunque sta accedendo alla tabella dei simboli, e non produce un messaggio di errore perché tabella dei simboli è un hash. Ma perché non c'è almeno un messaggio di avviso per accedere a un elemento non esistente?

+0

Interessante: 'my @array = @Whatever;' genera un errore, ovviamente. –

+2

Direi invece che '@Whatever :: whatever' identifica un array con scope dinamico chiamato' @ whatever' nel pacchetto 'Whatever', piuttosto che * *" che accede alla tabella dei simboli ... [in qualche modo] un hash . "* Identificatori qualificati come quelli hanno sempre evitato i' strict'ures. – pilcrow

+0

@pilcrow grazie. potresti per favore mettere questo come risposta? –

risposta

1

(adattamento/migrazione da un commento)

direi invece che @Whatever::whatever identifica un allineamento con ambito dinamico di nome @whatever nel pacchetto Whatever, piuttosto che questo è tutto "l'accesso alla tabella dei simboli ... [ un po 'come] un hash. "

Identificatori qualificati come quelli che hanno sempre evitato le stenosi (vedere i documenti per strict 'vars').

12

Perché è quasi impossibile catturare una variabile globale in uno stato di non esistenza in Perl. Non appena ne menzioni uno per nome - anche solo per fare un riferimento ad esso - esiste. E perché gli array e gli hash sono diversi dagli scalari; viene creato uno scalare con il valore undef, che attiva un avviso di "utilizzo del valore non inizializzato" quando viene utilizzato per la maggior parte degli scopi; ma gli array e gli hashs esistono come empty array e hash, e un array o hash vuoto non è abbastanza eccezionale da mettere in guardia!

+2

È impossibile solo se si costruisce il problema in modo troppo ristretto perché strict fa un buon lavoro per risolvere il problema. Il problema è che un'eccezione è stata specificatamente ritagliata per i nomi completi. Uno deve solo essere un po 'più attento nell'usarli. – ikegami

Problemi correlati