_  _   ,_
/^\/^\-/ @D
~(________/ PERL.LT
|L |L
L L
Straipsniai  Funkcijos 
Funkcijos/exists - patikrina ar yra hash key
  • exists EXPR

    Duotam išsireiškimui, kuris apibūdina hash'o arba masyvo elementą, gražina true, jei apibūdintas elementas hashe ar masyve niekada nebuvo inicializuotas, net jei atitinkama reikšmė yra neapibrėžta. Elementas nėra automatiškai atgaivinamas, jei neegzistuoja.

        print "Exists\n" 	if exists $hash{$key};
        print "Defined\n" 	if defined $hash{$key};
        print "True\n"      if $hash{$key};
        print "Exists\n" 	if exists $array[$index];
        print "Defined\n" 	if defined $array[$index];
        print "True\n"      if $array[$index];

    Hash'o ar masyvo elementas gali būti true tik jei jis apibrėžtas ir apibrėžtas jei egzistuoja. Atvirkštinė seka nebūtinai duoda true rezultatą.

    Duodant išsireiškimą, kuris aprašo paprogramės varda, gražina true, jei duota paprogramė buvo kada nors deklaruota, net jei ir neapibrėžta. Paminint paprogramės vardą exists arba define nesiskaito kaip deklaravimas. Pažymėtina, kad paprogramės vardas, kuris neegzistuoja, vis dar gali būti iškviečiamas: jis gali turėt AUTOLOAD metodą, kurio dėka paprogramė pradėti egzistuoti, kai pirmąkart iškviečiama - žr. perlsub.

        print "Exists\n" 	if exists &subroutine;
        print "Defined\n" 	if defined &subroutine;

    Pažymėtina, kad EXPR gali būti ypatingai komplikuotas, jei paskutinė operacija yra hash'o arba masyvo rakto paieška arba paprogramės vardas:

        if (exists $ref->{A}->{B}->{$key}) 	{ }
        if (exists $hash{A}{B}{$key}) 	{ }
        if (exists $ref->{A}->{B}->[$ix]) 	{ }
        if (exists $hash{A}{B}[$ix]) 	{ }
        if (exists &{$ref->{A}{B}{$key}})   { }

    Nors giliausias įdėtinis masyvas arba hash'as nepradės egzistuoti vien dėl to, kad jo egzistencija buvo pratestuota, tačiau bet kuris įsiterpiantis - pradės. Tokiu būdu $ref->{"A"} ir $ref->{"A"}->{"B"} pradės egzistuoti priklausomai nuo egzistavimo patikrinimo $key elementui viršuj. Taip atsitinka bet kur, kur panaudotas rodyklės operatorius (->), įskaitant netgi:

        undef $ref;
        if (exists $ref->{"Some key"})	{ }
        print $ref; 	    # išveda HASH(0x80d3d5c)

    Šis netikėtas automatiškas atgaivinimas nėra kas iš pirmo - ar net iš antro - žvilgsnio atrodo esantis lvalue kontekstas ir gali būti pataisytas ateities leidimuose.

    Žr. "Pseudo-hashes: Using an array as a hash" perlref'e dėl specifikacijų kaip exists() elgiasi, kai yra panaudotas pseudo-hashe'e.

    Paprogramės iškvietimo, o ne vardo, panaudojimas kaip argumento exists() yra klaida.

        exists ⊂	# OK
        exists &sub();	# Error
algirdas@perl.lt 2005.04.11 - $dabar