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 defined
ir 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.