Perl'de @_'nin anlamı nedir?


Yanıtlar:


119

perldoc perlvar , herhangi bir özel isimli Perl değişken bilgisini kontrol etmek için ilk yerdir.

Alıntı yapmak:

@_: Bir alt yordam içinde dizi @_, bu alt yordama aktarılan parametreleri içerir.

Perlvar'dan bağlanan perldoc perlsub (Perl alt yordamları) içinde daha fazla ayrıntı bulunabilir :

Dizide iletilen herhangi bir argüman görünür @_.

Bu nedenle, iki bağımsız değişkeni olan bir işlevi çağırırsanız, bunlar $_[0]ve içinde saklanacaktır $_[1].

Dizi @_bir olan yerel dizisi , ama onun unsurlardır fiili sayıl parametreleri için diğer adlar . Özellikle, bir $ _ [0] öğesi güncellenirse, ilgili bağımsız değişken güncellenir (veya güncellenemiyorsa bir hata oluşur).

Bir bağımsız değişken, işlev çağrıldığında var olmayan bir dizi veya karma öğeyse, bu öğe yalnızca (ve eğer) değiştirildiğinde veya ona bir başvuru alındığında oluşturulur. (Perl'in önceki bazı sürümleri, öğenin atanmış olup olmadığına bakılmaksızın öğeyi yarattı.) Tüm @_ dizisine atama, bu takma adı kaldırır ve herhangi bir argümanı güncellemez.


Teşekkürler, kısa süre önce perldoc'u kontrol etmeye alıştım ve web sayfalarını yararlı buldum: perldoc.perl.org/perlvar.html Bunu web'de başlatan bir perl saplaması yapmak fena değildi ... bir web sayfasının biçimlendirmesi bana çok yardımcı oluyor.
aschultz

27

Genellikle, değişkeni kullanarak bir alt öğeye iletilen parametreleri genişletirsiniz @_:

sub test{
  my ($a, $b, $c) = @_;
  ...
}

# call the test sub with the parameters
test('alice', 'bob', 'charlie');

Perikritik tarafından doğru olduğu iddia edilen yol budur .


2
bu bir kez katılmıyorum perlcritic, şahsen bunun bir işlev için en iyisi olduğunu düşünüyorum, ancak bir yöntem shiftiçin öz referans için yararlıdır , sonra @_diziyi açın . Bu bunun bir yöntemi olduğunu temizlemek yapar VE yöntem belirli parametreleri alır
Joel Berger

Muhtemelen daha önce PERLCritic'i kullanmalı / bilmeliydim ama kullanmadım. Bu örnekte kullandığınız için teşekkür ederiz. Bazen önceden bahsettiğiniz şeyler, birinin kendisi için tamamen yeni bir şey öğrenmesine yardımcı olabilir.
aschultz

12

Bir ilk isabeti için aramaperl @_ diyor bu :

@_, bir alt öğeye gelen parametrelerin listesidir.

Aynı zamanda daha uzun ve daha ayrıntılı bir açıklaması da var.


3
Aslında Google aramanızın ilk isabeti artık tam da bu sayfaya bağlanıyor.
Gabriel Southern

... yedi yıl sonra, internet zamanında bir sonsuzluk. Bu yüzden hem ilk sonuca bağlandım hem de ilgili kısmı sorguladım: Yalnızca Google'a bağlı olmak çok saflık olur.
Piskvor,

1
doğru, yıllar sonra, ancak sorunun cevabı için Google'a ihtiyacınız olduğunu ima eden cevabı okumak hala can sıkıcı. Googling'in bir sonucu olarak cevabı okuyan biri için anlamsız bir bilgi.
Gabriel Southern

2
Evet, aramak doğru ilk adımdır, ancak cevabınıza arama talimatlarını eklemeniz gerekmez. Bu, hiçbir değer katmayan gereksiz bilgilerdir ve ironiktir çünkü birisi cevabınızdaki arama bağlantısını takip ederse, onları başladıkları yere geri getirir.
Gabriel Southern

1
tüm bu "google it" yanıtları çok eskidi 😂
Austin Adams

11

Soru Perl'de ne @_ anlama geldiğiydi. Bu sorunun cevabı sürece, yani $_yollarla o Perl, @_benzer anlamına gelir onlar .

Hiç kimse bu kritik yönünü sözü gibi görünüyor onun yanı sıra - anlam onlarınki .

Sonuç olarak ikisi de zamir olarak veya bazen topikalleştirici olarak kullanılır.

Her zaman olmasa da, tipik olarak nominal öncülleri vardır.


7

Çoğu durumda tek tek değişkenler için shift'i de kullanabilirsiniz:

$var1 = shift;

Bu, Perl'in alt rutininizdeki dış bilgilere erişmek için bir dizi ilginç yolu olduğu için daha fazla araştırmanız gereken bir konudur.


3
Harika, kim bana benzer bir şey yapmanın başka bir yolunu yayınladığı için olumsuz oy verdi. Zaten birisi cevapladığı için soruyu doğrudan cevaplamadığımı fark ettim, ancak yeni perl programcılarının genellikle kafasının karıştığı alternatif bir form önerdim.
hockfan86


2

Ayrıca bir işlev bir dizi döndürürse, ancak işlev, döndürülen verileri aşağıdaki gibi herhangi bir değişkene atamadan çağrılır. Burada split () denir, ancak herhangi bir değişkene atanmamıştır. Döndürülen verilere daha sonra @_:

$str = "Mr.Bond|Chewbaaka|Spider-Man";
split(/\|/, $str);

print @_[0]; # 'Mr.Bond'

Bu, dizeyi böler ve diziyi $strayarlar @_.


1

@ bir dizi için kullanılır.

Bir alt yordamda veya Perl'de bir işlevi çağırdığınızda, parametre listesini iletebilirsiniz. Bu durumda, @_parametre listesini işleve iletmek için kullanılabilir:

sub Average{

    # Get total number of arguments passed.
    $n = scalar(@_);
    $sum = 0;

    foreach $item (@_){

        # foreach is like for loop... It will access every
        # array element by an iterator
        $sum += $item;
    }

    $average = $sum / $n;

    print "Average for the given numbers: $average\n";
}

İşlev çağrısı

Average(10, 20, 30);

Yukarıdaki kodu gözlemlerseniz, foreach $item(@_)satıra bakın ... Burada giriş parametresini geçer.


Her zaman yapmalısın use strict. Bu nedenle alt işlevinizi düzenledim.
EverythingRightPlace

0

@_ değişkenine asla düzenlemeyi denemeyin !!!! Dokunulmamalılar .. Ya da beklenmedik bir etki elde edersiniz. Örneğin...

my $size=1234;
sub sub1{
  $_[0]=500;
}
sub1 $size;

Sub1 $ boyutunu aramadan önce 1234'ü içerir. Ama 500 (!!) 'den sonra bu değeri değiştirmeyin !!! İki veya daha fazla değeri aktarabilir ve bunları alt programda değiştirebilirsiniz ve hepsi değişecektir! Bu etkinin tarif edildiğini hiç görmedim. Gördüğüm programlar ayrıca @_ array salt okunur bırakılıyor. Ve sadece değişkeni güvenli bir şekilde geçirebilmeniz için dahili alt rutini değiştirmeyin Her zaman bunu yapmalısınız:

sub sub2{
  my @m=@_;
  ....
}

Yerel alt rutin prosedür değişkenlerine @_ atayın ve daha sonra onlarla çalışın. Ayrıca, dizi döndüren bazı derin özyinelemeli algoritmalarda, yerel değişkenler için kullanılan belleği azaltmak için bu yaklaşımı kullanabilirsiniz. Sadece @_ dizi döndür aynı ise.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.