Apa arti dari @_ di Perl?

90

Apa arti dari @_perl?

Andrei
sumber

Jawaban:

119

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.

DVK
sumber
Terima kasih, saya baru saja membiasakan diri untuk memeriksa perldoc, dan saya menemukan halaman web berguna: perldoc.perl.org/perlvar.html Tidaklah buruk untuk membuat rintisan perl yang meluncurkan ini di web ... pemformatan halaman web sangat membantu saya.
aschultz
27

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 .

eckes
sumber
2
ini adalah satu kali saya tidak setuju dengan perlcritic, secara pribadi saya pikir ini yang terbaik untuk suatu fungsi, tetapi untuk metode, ini berguna untuk shiftreferensi diri, lalu buka paket @_array. Hal ini memperjelas bahwa ini adalah metode DAN metode tersebut mengambil parameter tertentu
Joel Berger
Saya mungkin seharusnya pernah menggunakan / mengetahui tentang PERLCritic sebelumnya, tetapi saya tidak melakukannya. Terima kasih telah menggunakannya dalam contoh ini. Terkadang hal-hal yang Anda rujuk begitu saja dapat membantu seseorang mempelajari sesuatu yang sama sekali baru bagi mereka.
aschultz
12

Hit pertama dari pencarianperl @_ mengatakan ini :

@_ adalah daftar parameter yang masuk ke sub.

Ini juga memiliki penjelasan yang lebih panjang dan lebih rinci tentang hal yang sama.

Piskvor meninggalkan gedung
sumber
3
Sebenarnya klik pertama pencarian Google Anda sekarang tertaut ke halaman ini.
Gabriel Southern
... tujuh tahun kemudian, waktu internet yang abadi. Itulah mengapa saya menautkan ke hasil pertama dan menanyakan bagian yang relevan: bergantung pada Google saja akan sangat naif.
Piskvor meninggalkan gedung
1
benar itu bertahun-tahun kemudian, tetapi masih menjengkelkan membaca jawaban yang menyiratkan bahwa Anda harus Google untuk mendapatkan jawaban atas pertanyaan itu. Ini adalah informasi yang tidak berguna bagi seseorang yang membaca jawaban sebagai hasil dari Googling.
Gabriel Southern
2
Ya, pencarian adalah langkah pertama yang benar, tetapi tidak perlu menyertakan instruksi untuk mencari dalam jawaban Anda. Ini adalah informasi yang berlebihan yang tidak menambah nilai, dan ini ironis karena jika seseorang mengikuti tautan pencarian di jawaban Anda, itu akan membawa mereka kembali ke tempat mereka memulai.
Gabriel Southern
1
semua jawaban "google it" ini sudah sangat tua 😂
Austin Adams
11

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.

tchrist
sumber
7

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.

hockfan86
sumber
3
Keren, siapa pun yang memberi saya suara buruk hanya karena memposting cara lain untuk melakukan hal serupa. Saya menyadari bahwa saya tidak menjawab pertanyaan secara langsung karena seseorang sudah menjawabnya, tetapi saya menawarkan bentuk alternatif yang sering membuat bingung programmer perl baru.
hockfan86
5

Semua "variabel khusus" Perl terdaftar di halaman dokumentasi perlvar .

aschepler
sumber
2

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 $strdan mengatur array @_.

Afser2000
sumber
1

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

Omar Faroque Anik
sumber
Anda harus selalu use strict. Karena itu saya mengedit subfungsi Anda.
EverythingRightPlace
0

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.

Anatoly
sumber