_  _   ,_
/^\/^\-/ @D
~(________/ PERL.LT
|L |L
L L
Straipsniai  Funkcijos 
Funkcijos/defined - patikrina ar reikšmė, kintamasis ar funkcija yra apibrėžta

  • defined EXPR
  • defined

    Gražina Boolean reikšmę, pasakančią ar EXPR turi kitokią reikšmę nei neapibrėžtumo undef. Jei EXPR nėra, $_ bus tikrinamas.

    Daug operacijų gražina undef kad parodyti nesėkmę, failo pabaigą, sistemos klaidą, neparašytą kintąmąjį ir kitas išskirtines sąlygas. Ši funkcija leidžia atskirti undef nuo kitų reikšmių (paprasčiausias Boolean testas neatskirs undef, zero ir tuščio string'o ir "0" , kurie visi yra vienodai false.) Isidėmėtina, kad nors undef yra galiojantis skaliaras, jo buvimas nebūtinai parodo išimtines sąlygas: pop grąžina undef, kai jos argumentas yra tuščias masyvas arba kai elementas, kurį reikia gražinti būna undef.

    Taip pat galima naudoti defined(&func) patikrinti ar paprogramė &func kada nors buvo apibrėžta. Grąžinama reikšmė nėra paveikiama jokių tolimesnių &func deklaracijų. Prisiminkite, kad paprogramė, kuri yra neapibrėžta, vis dar gali būti sėkmingai kviečiama: ji gali turėti AUTOLOAD metodą, kuris priverčia ją pasirodyti realybėje pirmą kartą, kai yra pakviesta -- žiūrėkite perlsub.

    Defined naudojimas agregatamas (hash'ams ir masyvams) yra atgyvenęs. Jis pranešdavo ar atmintis tam agregatui kada nors buvo išskirta. Tačiau tokia elgsena gali ateities Perl versijose dingti. Geriau naudoti paprastą testą dydžiui:

        if (@an_array) { print "has array elements\n" }
        if (%a_hash)   { print "has hash members\n"   }

    Kai naudojamas hash'o elementui, jis pasako ar reikšmė apibrėžta, o ne ar raktas egzistuoja hash'e. Naudokite exists pastarąjam tikslui.

    Pavyzdžiai:

        print if defined $switch{'D'};
        print "$val\n" while defined($val = pop(@ary));
        die "Can't readlink $sym: $!"
    	unless defined($value = readlink $sym);
        sub foo { defined &$bar ? &$bar(@_)  o>: die "No bar"; }
        $debugging = 0 unless defined $debugging;

    Pastaba: Daug kas mėgsta pernelyg dažnai naudoti definedir paskui labai nustemba padarę atradimą, kad skaičius 0 ir "" (nulinio ilgumo string'as) yra, tiesą sakant, apibrėžtos reikšmės. Pvz, jei sakytume

        "ab" =~ /a(.*)b/;

    Pattern'as sutiko ir $1 yra apibrėžtas, nežiūrint į tai, kad jis atitiko "niekam". Bet iš tikrųjų jis neatitiko nieko - kitaip tariant jis atitiko kažką, kas buvo nulio simbolių ilgio. Visa tai visiškai tikra. Kai funkcija gražina neapibrėžtą reikšmę, savaime aišku, kad ji negalės gražinti tikro atsakymo. Taigi, naudoti defined reiktų tik tada, kai tikrinamas daromos programos ar kažko vientisumas. Kitais kartais viskas ko reikia yra tiesiog sulyginimas su 0 ar "".

    Taip pat žiūrėkite undef, exists, ref.

algirdas@perl.lt 2005.04.11 - $dabar