Saya tampaknya telah menemukan beberapa cara berbeda untuk menemukan ukuran array. Apa perbedaan antara ketiga metode ini?
my @arr = (2);
print scalar @arr; # First way to print array size
print $#arr; # Second way to print array size
my $arrSize = @arr;
print $arrSize; # Third way to print array size
print 0+@arr
,print "".@arr
,print ~~@arr
"".@arr
seperti"@arr"
halnya sesuatu yang sangat berbeda.Jawaban:
Cara pertama dan ketiga adalah sama: mereka mengevaluasi sebuah array dalam konteks skalar. Saya akan menganggap ini sebagai cara standar untuk mendapatkan ukuran array.
Cara kedua sebenarnya mengembalikan indeks terakhir dari array, yang tidak (biasanya) sama dengan ukuran array.
sumber
$[
ditentukan menentukan "Indeks elemen pertama dalam array, dan karakter pertama dalam substring" (perldoc perlvar
). Ini diatur ke 0 secara default, dan pengaturan ke apa pun selain 0 sangat tidak dianjurkan.$[
berkecil hati (dan telah selama satu dekade).$[
sudah ditinggalkan. Menggunakan$[
masalah peringatan penghentian bahkan ketika seseorang tidak menyalakan peringatan. Menetapkan apa pun kecuali nol untuk$[
akan menjadi kesalahan dalam 5.16. Bisakah kita berhenti menyebutkan$[
?$[
akan tahu efeknya.scalar @arr
dan masih$#arr
harus memahami efek yang mungkin terjadi , meskipun jarang.$[
Pertama, yang kedua tidak setara dengan dua lainnya.
$#array
mengembalikan indeks terakhir array, yang lebih kecil dari ukuran array.Dua lainnya hampir sama. Anda hanya menggunakan dua cara berbeda untuk membuat konteks skalar. Itu datang ke pertanyaan keterbacaan.
Saya pribadi lebih suka yang berikut ini:
Saya merasa lebih jelas daripada
dan
Yang terakhir terlihat cukup jelas sendirian seperti ini, tetapi saya menemukan bahwa garis tambahan menghilangkan kejelasan ketika bagian dari kode lain. Ini berguna untuk mengajarkan apa yang
@array
dilakukan dalam konteks skalar, dan mungkin jika Anda ingin menggunakan$size
lebih dari sekali.sumber
my $size=@array
Sepertinya itu mungkin kesalahan di mana sigil yang salah digunakan.scalar
tanpa alasan mempelajari pelajaran yang salah. Mereka mulai masuk ke dalam kepala mereka bahwa operator mengembalikan daftar yang dapat dipaksa menjadi skalar. Terlihat puluhan kali.scalar
karena Anda memaksa daftar untuk konteks skalar. Itulah alasan yang tepat untuk menggunakannya. Contoh Anda melakukan hal yang persis sama, tetapi bergantung pada apa yang dilakukan Perl ketika Anda mengevaluasi variabel daftar dalam konteks skalar yang tersirat. Dengan demikian, contoh Anda mengharuskan pembaca untuk mengetahui tentang perilaku implisit Perl dalam konteks itu. Anda hanya menambahkan satu lapisan perilaku implisit ke ekspresi, dan Perl sudah memiliki terlalu banyak perilaku implisit yang harus Anda pertimbangkan untuk menguraikan suatu program.scalar
karena Anda memaksa daftar untuk konteks skalar", Anda telah membuktikan poin saya tentang mempelajari pelajaran yang salah. Ini sepenuhnya salah. Tidak ada daftar yang dipaksa olehscalar
. (Jika ya,scalar(@array)
danscalar(@array[0..$#array])
akan mengembalikan hal yang sama.)scalar(@array)
Memberitahu@array
untuk mengembalikan skalar, yang sudah Anda suruh lakukanmy $size=
.Ini mendapatkan ukuran dengan memaksa array ke dalam konteks skalar, di mana ia dievaluasi sebagai ukurannya:
Ini adalah cara lain untuk memaksa array ke dalam konteks skalar, karena ia ditugaskan ke variabel skalar:
Ini mendapatkan indeks dari elemen terakhir dalam array, jadi sebenarnya ukuran minus 1 (dengan asumsi indeks mulai dari 0, yang dapat disesuaikan di Perl meskipun hal itu biasanya merupakan ide yang buruk):
Yang terakhir ini tidak terlalu bagus untuk digunakan untuk mendapatkan ukuran array. Akan bermanfaat jika Anda hanya ingin mendapatkan elemen terakhir dari array:
Juga, seperti yang Anda lihat di sini di Stack Overflow, konstruk ini tidak ditangani dengan benar oleh kebanyakan sintaksis ...
sumber
$arr[-1]
untuk mendapatkan elemen terakhir. Dan$arr[-2]
untuk mendapatkan yang kedua dari belakang, dan seterusnya.$#arr
bukan fitur yang sangat berguna, dan bukan kebetulan bahwa bahasa lain tidak memilikinya.Untuk menggunakan cara kedua, tambahkan 1:
sumber
for [0..$#array] { print $array[$_ ] }
bekerja dengan sangat baik meskipun jika tujuan mendapatkan jumlah elemen adalah untuk beralih melalui array. Keuntungannya adalah Anda mendapatkan elemen serta penghitung yang selaras.Ketiganya memberikan hasil yang sama jika kita sedikit memodifikasi yang kedua:
sumber
Contoh:
sumber
Bagian “Perl variable types” dari dokumentasi perlintro berisi
The dokumentasi perldata juga mencakup ini dalam “nilai-nilai skalar” bagian .
Sebelumnya di bagian yang sama mendokumentasikan cara mendapatkan indeks elemen terakhir array.
sumber
Ada berbagai cara untuk mencetak ukuran array. Inilah arti dari semuanya: Katakanlah array kita adalah
my @arr = (3,4);
Metode 1: skalar
Ini adalah cara yang tepat untuk mendapatkan ukuran array.
Metode 2: Nomor indeks
$#arr
memberikan indeks terakhir dari sebuah array. jadi jika array berukuran 10 maka indeks terakhirnya adalah 9.Kami menambahkan 1 di sini mengingat array sebagai 0-diindeks . Tapi, jika bukan nol maka logika ini akan gagal .
Contoh di atas mencetak 6, karena kami telah menetapkan indeks awal menjadi 4. Sekarang indeks akan menjadi 5 dan 6, dengan masing-masing elemen 3 dan 4.
Metode 3:
Ketika sebuah array digunakan dalam konteks skalar, maka ia mengembalikan ukuran array
Sebenarnya metode 3 dan metode 1 sama.
sumber
Dari perldoc perldata , yang seharusnya aman untuk dikutip:
Asalkan Anda tidak $ # apa pun ++ dan secara misterius meningkatkan ukuran atau array Anda.
dan
Yang membawa saya ke apa yang saya cari yaitu cara mendeteksi array kosong. Saya menemukannya jika $ # kosong == -1;
sumber
Bagaimana
int(@array)
dengan itu mengancam argumen sebagai skalar.sumber
Untuk menemukan ukuran array gunakan
scalar
kata kunci:Untuk mengetahui indeks terakhir dari array ada
$#
(Perl default variabel). Ini memberikan indeks terakhir dari sebuah array. Ketika sebuah array dimulai dari 0, kita mendapatkan ukuran array dengan menambahkan satu ke$#
:Contoh:
Keluaran:
sumber