ProgramlamaPerl Backend Geliştirici, Veri Mühendisi (Perl), Perl Fullstack

Tanımlı operatörü ile çalışırken hangi gizli tehlikeler vardır ve Perl'deki farklı değişken türlerinde değerlerin varlığını ve boş olmadığını nasıl doğru bir şekilde kontrol ederiz?

Hintsage yapay zeka asistanı ile mülakatları geçin

Cevap.

Perl'deki defined operatörü, bir değerin tanımlı olup olmadığını kontrol eder (undefined olup olmadığını). Önemli olan:

  • Skalar için: defined($x) eğer $x undefined değilse (boş bir dize veya 0 olsa bile) true döner.
  • Hash için: defined($hash{$key}), elemanın değerinin tanımlı olup olmadığını kontrol eder, ancak anahtarın kendisinin mevcut olduğunu garanti etmez.
  • Dizi için: defined($array[$i]) — benzer şekilde, eleman tanımlı olabilir, ancak dizi daha uzun veya daha kısa olabilir.
  • Hash'deki anahtarın varlığını kontrol etmek için 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

Soru tuzağı.

exists $hash{$key} ile defined $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

Konuyla ilgili bilgi eksikliğinden kaynaklanan gerçek hata örnekleri.


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.