Apa arti dari @_
perl?
perldoc perlvar adalah tempat pertama untuk memeriksa info variabel Perl yang diberi nama khusus.
Mengutip:
@_
: Di dalam subrutin, larik@_
berisi parameter yang diteruskan ke subrutin tersebut.
Rincian lebih lanjut dapat ditemukan di perldoc perlsub (subrutin Perl) ditautkan dari perlvar:
Setiap argumen yang diteruskan muncul dalam larik
@_
.Oleh karena itu, jika Anda memanggil fungsi dengan dua argumen, argumen tersebut akan disimpan di
$_[0]
dan$_[1]
.Array
@_
adalah larik lokal , tetapi elemennya adalah alias untuk parameter skalar sebenarnya . Secara khusus, jika elemen $ _ [0] diperbarui, argumen terkait diperbarui (atau kesalahan terjadi jika tidak dapat diperbarui).Jika argumen adalah larik atau elemen hash yang tidak ada saat fungsi dipanggil, elemen itu dibuat hanya jika (dan jika) diubah atau referensi ke sana diambil. (Beberapa versi Perl membuat elemen apakah elemen itu ditugaskan atau tidak.) Menugaskan ke seluruh array @_ menghapus aliasing itu, dan tidak memperbarui argumen apa pun.
Biasanya, Anda memperluas parameter yang diteruskan ke sub menggunakan
@_
variabel:sub test{ my ($a, $b, $c) = @_; ... } # call the test sub with the parameters test('alice', 'bob', 'charlie');
Begitulah cara yang diklaim benar oleh perlcritic .
sumber
perlcritic
, secara pribadi saya pikir ini yang terbaik untuk suatu fungsi, tetapi untuk metode, ini berguna untukshift
referensi diri, lalu buka paket@_
array. Hal ini memperjelas bahwa ini adalah metode DAN metode tersebut mengambil parameter tertentuHit pertama dari pencarian
perl @_
mengatakan ini :Ini juga memiliki penjelasan yang lebih panjang dan lebih rinci tentang hal yang sama.
sumber
Pertanyaannya adalah apa
@_
artinya di Perl. Jawaban untuk pertanyaan itu adalah bahwa, sejauh$_
sarana itu di Perl,@_
sama artinya mereka .Tidak ada yang tampaknya telah disebutkan aspek penting dari yang makna - serta mereka .
Akibatnya keduanya digunakan sebagai kata ganti, atau kadang-kadang sebagai topikalizer.
Mereka biasanya memiliki anteseden nominal, meskipun tidak selalu.
sumber
Anda juga dapat menggunakan shift untuk variabel individual dalam banyak kasus:
$var1 = shift;
Ini adalah topik yang harus Anda teliti lebih lanjut karena Perl memiliki sejumlah cara menarik untuk mengakses informasi luar di dalam sub rutin Anda.
sumber
Semua "variabel khusus" Perl terdaftar di halaman dokumentasi perlvar .
sumber
Juga jika suatu fungsi mengembalikan larik, tetapi fungsi tersebut dipanggil tanpa menetapkan data yang dikembalikan ke variabel seperti di bawah ini. Di sini split () dipanggil, tetapi tidak ditugaskan ke variabel apa pun. Kita dapat mengakses data yang dikembalikan nanti melalui @_:
$str = "Mr.Bond|Chewbaaka|Spider-Man"; split(/\|/, $str); print @_[0]; # 'Mr.Bond'
Ini akan memisahkan string
$str
dan mengatur array@_
.sumber
@
digunakan untuk sebuah array.Dalam subrutin atau saat Anda memanggil fungsi di Perl, Anda mungkin melewatkan daftar parameter. Dalam hal ini,
@_
is dapat digunakan untuk meneruskan daftar parameter ke fungsi: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"; }
Panggilan fungsi
Average(10, 20, 30);
Jika Anda mengamati kode di atas, lihat
foreach $item(@_)
baris ... Ini melewati parameter input.sumber
use strict
. Karena itu saya mengedit subfungsi Anda.Jangan pernah mencoba mengedit ke variabel @_ !!!! Mereka harus tidak disentuh .. Atau Anda mendapatkan efek yang tidak terduga. Sebagai contoh...
my $size=1234; sub sub1{ $_[0]=500; } sub1 $size;
Sebelum panggilan sub1 $ size berisi 1234. Tapi setelah 500 (!!) Jadi Anda Jangan edit nilai ini !!! Anda dapat memberikan dua atau lebih nilai dan mengubahnya dalam subrutin dan semuanya akan diubah! Saya belum pernah melihat efek ini dijelaskan. Program yang pernah saya lihat juga membiarkan @_ array hanya baca. Dan hanya itu Anda dapat dengan aman meneruskan variabel jangan mengubah subrutin internal Anda harus selalu melakukan itu:
sub sub2{ my @m=@_; .... }
menetapkan @_ ke variabel prosedur subrutin lokal dan selanjutnya bekerja dengannya. Juga dalam beberapa algoritma rekursif mendalam yang returun array, Anda dapat menggunakan pendekatan ini untuk mengurangi memori yang digunakan untuk vars lokal. Hanya jika mengembalikan @_ array yang sama.
sumber