ProgramlamaPerl Geliştiricisi/Backend Geliştirici

Perl'deki bağlamlar (skalar, liste ve void) nasıl çalışır? Bağlam seçiminden kodun davranışının etkilendiği örnekler verin.

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

Cevap

Perl'de, operatörlerin ve fonksiyonların davranışını etkileyen bağlamlar vardır:

  • Skalar (scalar) — ifade bir değer olarak hesaplanır.
  • Liste (list) — ifade bir değerler listesi olarak hesaplanır.
  • Void — sonuç kullanılmaz.

Fonksiyonlar ve operatörler bağlama bağlı olarak farklı sonuçlar döndürebilir.

Örnekler:

my @arr = (1, 2, 3); my $count = @arr; # skalar bağlam: $count = 3 my @copy = @arr; # liste bağlamı: tüm dizi kopyalanır my $line = <STDIN>; # bir satır okur (skalar) my @lines = <STDIN>; # tüm satırları okur (liste)

Bağlam açık bir şekilde scalar() fonksiyonu ile ayarlanabilir:

my $last_idx = scalar @arr; # zorla skalar bağlam

Kandırmaca Soru

keys %hash fonksiyonu skalar bağlamda ne değer döndürecektir?

Cevap: Liste bağlamında anahtarların listesi yerine, hash'deki elemanların sayısını döndürecektir.

my %h = (a=>1, b=>2); my $num = keys %h; # $num = 2 my @keys = keys %h; # @keys = ('a', 'b')

Konunun detaylarını bilmemekten kaynaklanan gerçek hata örnekleri


Hikaye

Bir projede dizi elemanlarının sayısını saymak istediler:

my @items = get_items(); my $cnt = @items;

Daha sonra biri $cnt = get_items(); şeklinde atama yapmaya çalıştı ve fonksiyonun bir liste döndürdüğünü anlamadığı için artık her zaman yalnızca bir (ilk) döndürülen değer elde ediliyordu, oysa eleman sayısını almak istemişti.


Hikaye

Bir dosyadan satırları okurken:

my $lines = <FILE>;

Tüm dosyayı almak isterken, ilk satır elde edildi — skalar bağlamda sadece tek bir satır döndüğünü dikkate almadık.


Hikaye

Geliştirici, alınan değeri kullanmadan void bağlamında bir fonksiyon çağırdı:

open_my_file(); # fonksiyon bir tanımlayıcı döndürüyor, ama kaydedilmedi

Bu hata ayıklamayı zorlaştırdı — fonksiyon çalışıyordu, fakat dosya hiçbir yerde kaydedilmiyordu ve hatalar yakalanmıyordu.