@_
Perl kelimesinin anlamı nedir ?
Yanıtlar:
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.
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 .
perlcritic
, şahsen bunun bir işlev için en iyisi olduğunu düşünüyorum, ancak bir yöntem shift
iç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
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.
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.
Ç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.
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 $str
ayarlar @_
.
@
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";
}
Average(10, 20, 30);
Yukarıdaki kodu gözlemlerseniz, foreach $item(@_)
satıra bakın ... Burada giriş parametresini geçer.
use strict
. Bu nedenle alt işlevinizi düzenledim.
@_ 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.