ProgramlamaBackend Geliştirici

Perl'deki alt programlarda argüman listesi işleme ile ilgili hangi özellikler vardır ve bir fonksiyondan değerleri nasıl doğru bir şekilde döndürmeliyiz?

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

Cevap

Perl'deki alt programlar, iletilen tüm parametrelerin otomatik olarak yerleştirildiği özel bir dizi değişken @_ aracılığıyla argüman alır. Perl'in özelliği, parametrelerin @_ içine referans olarak girmesidir; bu nedenle, fonksiyon içinde yapılan değişiklikler dışarıdaki değerleri de değiştirir.

Gönderilen verilerin beklenmedik bir şekilde değiştirilmesini önlemek için, parametrelerin değişkenlere kopyalanması önerilir:

sub sum { my ($a, $b) = @_; return $a + $b; }

Perl fonksiyonları her zaman liste değerleri döndürür ve fonksiyonun sonucu, son hesaplanan liste ya da açık bir return ifadesidir.

sub minmax { my ($x, $y) = @_; return ($x < $y ? $x : $y, $x > $y ? $x : $y); } my ($min, $max) = minmax(4, 7); # $min = 4; $max = 7

Eğer fonksiyon bir skalar bağlamında çağrılırsa, döndürülen elemanların sayısını verir, eğer sonucu skalar bir değişken içine almazsanız.


Kandırmaca Soru

Perl fonksiyonuna büyük sayıda değişkeni nasıl aktarmalıyız ki, orijinal değişkenlerin değerlerini yanlışlıkla değiştirmeyelim?

Bilinçsizce şu şekilde yanıtlar verilir: "Argümanları normal bir şekilde değişkenlere kopyalamak yeter!"

Doğru cevap:

Kopyalama sadece skalarler için geçerlidir. Eğer diziler veya hash'lerle çalışıyorsanız, verilerin aktarımını açıkça yönetmek ve referansla kopyaları önlemek için referanslar kullanmalısınız:

sub modify { my ($arr_ref) = @_; push @$arr_ref, 'new'; # orijinal diziyi değiştirir } my @data = (1, 2, 3); modify(\@data); # şimdi @data = (1, 2, 3, 'new')

Tarih


Tarih 1

Büyük bir rapor işleme betiğinde, iç fonksiyon ana programdan geçirilen dizi elemanlarının değerlerini değiştirdi. Sonuçta, fonksiyon çalıştırıldığından, orijinal veriler bozuldu. Hatanın kaynağı, fonksiyon yazarının giriş değerlerinin kopyalarını yapmamasıdır; bunun yerel olacağını sanıyordu, ancak bu @_ ile diziler için doğru değildir.


Tarih 2

Perl 4'ten (değişkenlerin başka bir şekilde kopyalandığı) betiklerin taşınması sırasında, ekip, iç içe hash'lerin iletilmesinin, alt program çağrıları arasında beklenmeyen "veri sızıntısına" neden olduğunu gördü; bir fonksiyondaki hash alanlarının değiştirilmesi kodun diğer kısımlarını etkiliyordu. Nedeni, @_ listesindeki hash'e yapılan referanstır.


Tarih 3

Bir geliştirici, sonuçların bir dizisini döndüren bir fonksiyon implementasyonu gerçekleştirdi, ancak çağrıldığı yer skalar bir bağlam kullandı: $count = func(@params);. İlk döndürülen elemanın değeri değişkene atanması bekleniyordu, ancak gerçekte $count'ta listedeki elemanların sayısı bulundu; bu, hesaplamalarda gecikmelere ve karışıklıklara yol açtı.