exists ESPR
Data un'espressione che specifica un elemento di un hash o di un
array, restituisce vero se l'elemento specificato nell'hash o
nell'array è mai stato inizializzato, anche se il
corrispondente valore è indefinito. L'elemento non viene
autovivificato se non esiste.
print "Esiste\n" if exists $hash{$key};
print "Definito\n" if defined $hash{$key};
print "Vero\n" if $hash{$key};
print "Esiste\n" if exists $array[$index];
print "Definito\n" if defined $array[$index];
print "Vero\n" if $array[$index];
Un elemento di un hash o di un array può essere vero solo
se è definito e definito solo se esiste, ma il viceversa
non necessariamente mantiene il valore vero.
Data un'espressione che specifichi il nome di una subrotuine,
restituisce vero se la subroutine specificata è stata
dichiarata, anche se è indefinita. Menzionare il nome di
una subroutine per exists o defined non conta come il dichiararla.
Va notato che una subroutine che non esiste può essere
ancora richiamabile: il suo package potrebbe avere un metodo
AUTOLOAD che lo fa nascere all'improvviso la prima volta che
viene chiamato, consultate perlsub.
print "Esiste\n" if exists &subroutine;
print "Definito\n" if defined &subroutine;
Va notato che ESPR può essere arbitrariamente complicata
finché l'operazione conclusiva è una ricerca
della chiave di un hash o di un array o del nome di una
subroutine:
if (exists $ref->{A}->{B}->{$chiave}) { }
if (exists $hash{A}{B}{$chiave}) { }
if (exists $ref->{A}->{B}->[$ix]) { }
if (exists $hash{A}{B}[$ix]) { }
if (exists &{$ref->{A}{B}{$chiave}}) { }
Sebbene l'array o l'hash più profondamente annidato non
nascerà all'improvviso solo perché la sua esistenza
è stata verificata, quelli intermedi lo faranno. Dunque
$ref-{"A"}> e $ref-{"A"}->{"B"}> nasceranno
all'improvviso a causa del test di esistenza per l'elemento
$chiave visto sopra. Questo avviene ovunque sia usato l'operatore
freccia, incluso anche:
undef $ref;
if (exists $ref->{"Una qualche chiave"}) { }
print $ref; # stampa HASH(0x80d3d5c)
Questa sorprendente autovivificazione in quello che non appare
essere, ad una prima o anche seconda occhiata, un lvalue [valore
a sinistra di un'espressione, NdT], potrebbe essere corretto in
una versione futura.
Consultate perlref/"Pseudo-hashes: Using an array as a hash"
["Pseudo-hash: Usare un array come un hash", NdT] per le specifiche
su come exists() si comporta quando usato su uno pseudo-hash.
L'uso di una chiamata a subroutine, invece che un nome di subroutine,
come argomento di exists() è un errore.
exists ⊂ # OK
exists &sub(); # Errore