Perl'de işlevlerin argümanları @_ dizisi üzerinden geçmektedir. Alt program çağrıldığında, iletilen tüm parametreler bu dizinin içinde yer alır ve başlangıçta — bu bir listedir, yani eğer $_[0]'ı değiştirirseniz, orijinal değeri değiştirirsiniz.
sub foo { my ($arg1, $arg2) = @_; $arg1 = 10; # Sadece yerel değişken değişir }
sub bar { my ($array_ref) = @_; push @$array_ref, 42; } my @data = (1,2,3); bar(\@data); # @data şimdi (1,2,3,42)
@_ içindeki sıradan değişkenler ($foo, $bar) orijinal argümanların taklitleridir, ancak my ($a, $b) = @_ ile açıldığında kopyalar oluşturulur.Eğer Perl'de bir işleve dizi şu şekilde geçirilirse:
myfunc(@arr), ve işlevin içinde$_[0]'a başvurulursa, orada ne olacaktır?
Doğru cevap: Orada dizinin ilk değeri olacaktır, tüm diziye bir referans değil! Bir diziyi tam bir nesne olarak geçmek için referans kullanın: myfunc(\@arr).
sub print_first { print $_[0], " "; } my @a = qw/foo bar baz/; print_first(@a); # 'foo' yazdırır, diziye referans değil print_first(\@a); # ARRAY(0x...) — tüm diziye referans yazdırır
Tarihçe
update_hash(%global). İçeride $_[0]'ı değiştirdik. Sonuç olarak — sadece argüman dizi kesitinin yerel kısmı değişti, küresel hash ise değiştirilmedi. Doğru çözüm referans geçişi oldu: update_hash(\%global).Tarihçe
myfunc(@arr, %opts). Görüldü ki bazı hash anahtarları dizi değerleriyle değiştiriliyordu ve hatayı tespit etmek zor oldu.Tarihçe
Ağaçta özyinelemeli geçiş uygularken iç elemanları değiştirmek istiyorduk. İşleve dizileri "olduğu gibi" geçiyorduk, referansla değil. Kopyalarını oluşturuyorlardı, değişiklikler dış bağlama yansımıyordu. Problem, iletimleri referans stiline değiştirmekle çözüldü.