indietro

  • 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