Perl, programın çalışmasını etkileyen birçok sihirli değişken içerir (aynı zamanda "özel" veya "sistem" olarak da bilinir):
$_ — birçok operatör için varsayılan değişken (foreach, map, grep, while <> vb.).@_ — alt programlar içindeki gelen argümanların dizisi.%SIG — işletim sisteminin sinyal işleyicileri için bir hash.my @nums = (1,2,3); foreach (@nums) { $_ *= 2; # orijinal dizi değişiyor! } sub show_args { print "İlk: ", $_[0], " "; } show_args('a','b'); # $_[0] = 'a' $SIG{INT} = sub { print "Ctrl-C yakalandı "; exit; };
Dikkat: birçok sihirli değişken dolaylı olarak değiştirilir; yanlış kullanım, programın küresel durumunu etkileyebilir.
İç içe döngüler veya alt programlarda global değişken $_'yi güvenli bir şekilde kullanmak mümkün mü?
Cevap: Hayır, çünkü iç içe döngü veya alt program sıklıkla $_'yi yeniden yazmakta, bu da dış bağlamdaki değerin kaybına neden olmaktadır. Açık değişkenler kullanılması önerilir:
foreach my $x (@a) { foreach my $y (@b) { ... } }
Hikaye
Büyük log dosyalarını işlemek için yazılmış bir scriptte while(<FH>) {...} döngüsü kullanıldı. Döngü içinde, kendi değişkenini belirlemeyen bir map çağrısı yapan bir fonksiyon çağrıldı, bu da dış döngüdeki $_'yi bozarak satırların atlanmasına neden oldu.
Hikaye
%SIG üzerinden sinyalleri işlediği sırada, geliştirici __DIE__ işleyicisini değiştirdi, ancak bunun tüm sürecin davranışını, dış modüller de dahil olmak üzere etkileyebileceğini dikkate almadı ve başka bir kodda hatalar meydana geldiğinde kontrolsüz bir kapanma yaşadı.
Hikaye
Alt program içinde diziye (@_) referansla argüman geçişinin optimize edilmesi ve doğrudan değerlerini değiştirme girişimi, dış kodda değişkenlerin beklenmedik şekilde değişmesine yol açtı.