ProgramlamaBackend Perl geliştiricisi

Perl'de sihirli değişkenlerle (örneğin, $_, @_ ve %SIG) çalışmanın özelikleri nelerdir? Bu değişkenlerin yanlış kullanımı, programın mantığını nasıl etkileyebilir?

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

Cevap

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.

Kandırmaca Soru

İç 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) { ... } }

Konuyla ilgili bilgi eksikliğinden kaynaklanan gerçek hatalara örnekler


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ı.