ProgramlamaFull Stack Perl Developer

Perl'de alt programlara argüman iletmenin hangi yöntemleri vardır ve referansla nasıl iletimi organize edebilirsiniz? @_ ile çalışmanın incelikleri nelerdir ve referansla iletim ne zaman gereklidir?

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

Cevap

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.

Değerle iletim:

sub foo { my ($arg1, $arg2) = @_; $arg1 = 10; # Sadece yerel değişken değişir }

Referansla iletim:

sub bar { my ($array_ref) = @_; push @$array_ref, 42; } my @data = (1,2,3); bar(\@data); # @data şimdi (1,2,3,42)

İncelikler:

  • Orijinal dizi veya hash'i değiştirmek istiyorsanız — bir referans geçirin.
  • @_ 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.
  • Diziler ve hash'ler normalde iletildiğinde içerikleri liste olarak açılır ve sınırları kaybedersiniz: referans geçmeniz veya kaydırma özelliklerini kullanmanız gerekir.

Kandırma Sorusu

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

Örnek:

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

Bir projede küresel bir hash'i değiştirmek için işlevi şu şekilde çağırdık: 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

API çerçevesi yazarken işlevlere birçok isimlendirilmiş argüman geçiyorduk, hash kullanarak. Bazen işleve bir dizi geçiriyorduk (ama referans değil!), ve argümanlar "karışıyordu", bu da kafa karışıklığına neden oluyordu: 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ü.