Perl'de, operatörlerin ve fonksiyonların davranışını etkileyen bağlamlar vardır:
scalar) — ifade bir değer olarak hesaplanır.list) — ifade bir değerler listesi olarak hesaplanır.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
keys %hashfonksiyonu 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')
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 kaydedilmediBu hata ayıklamayı zorlaştırdı — fonksiyon çalışıyordu, fakat dosya hiçbir yerde kaydedilmiyordu ve hatalar yakalanmıyordu.