Perl'deki defined operatörü, bir değerin tanımlı olup olmadığını kontrol eder (undefined olup olmadığını). Önemli olan:
defined($x) eğer $x undefined değilse (boş bir dize veya 0 olsa bile) true döner.defined($hash{$key}), elemanın değerinin tanımlı olup olmadığını kontrol eder, ancak anahtarın kendisinin mevcut olduğunu garanti etmez.defined($array[$i]) — benzer şekilde, eleman tanımlı olabilir, ancak dizi daha uzun veya daha kısa olabilir.exists kullanılır.Örnek:
my %h = (a => undef); if (exists $h{a}) { print "Anahtar 'a' mevcut "; } if (defined $h{a}) { print "Anahtar 'a' tanımlı "; } else { print "Anahtar 'a' tanımlı değil "; }
Sonuç:
Anahtar 'a' mevcut
Anahtar 'a' tanımlı değil
exists $hash{$key}iledefined $hash{$key}arasındaki fark nedir ve hash için tanım kontrolü ne zaman beklenmedik bir sonuç verecektir?
Cevap: defined $hash{$key} değeri kontrol eder, ancak eğer anahtar mevcut değilse belirsiz bir değer verir. Eğer anahtar varsa ama değeri undef ise, defined false döner. Ancak anahtar yoksa da false döner. Bu nedenle her zaman anahtarın varlığını kontrol etmek için exists kullanmalısınız.
Örnek:
my %h = (foo => undef); if (defined $h{foo}) { ... } # false if (exists $h{foo}) { ... } # true
Hikaye
Bir projede "hazır olma" bayrağını
defined($status{$id})olarak kontrol ediyorlardı ve eğer değer undef ise, görevi işlenmemiş olarak kabul ediyorlardı. Ancak undef değerine sahip anahtarlar geçerliydi ve exists kontrolü yoktu — sonuç olarak, bir kısmı işlenmiş verileri tekrar çalıştırdılar.
Hikaye
Bir programcı, bir dosyadan veri aktarırken dizeleri şöyle karşılaştırıyordu:
if (defined $line && $line ne ''). Sorun: bazen $line sıfır dizesi '0' olabiliyordu. Bu dize boş değil, ama defined ile karşılaştırma (ne yerine '') bu dizelerin kaybına neden oluyordu.
Hikaye
Hash'lerle çalışırken tek varlık kontrolü defined olan büyük bir Perl betiğinde, undef değeri olan anahtarlar için hatalar ve raporlarda kaybolan veriler ortaya çıkıyordu.