Array menyimpan sejumlah nilai berurutan di bawah satu nama variabel, dan Perl menandainya dengan karakter @ di depan nama variabelnya. Topik ini membahas cara mendeklarasikan array, mengakses dan mengganti elemennya melalui indeks, menghitung indeks terakhir dan jumlah elemen, serta mengoperasikan kedua ujung array dengan push, pop, shift, dan unshift. Seluruh contoh disajikan sebagai skrip utuh yang dapat dijalankan, sehingga setiap mekanisme dapat diverifikasi langsung dari keluarannya.
Mendeklarasikan dan mengakses array#
Array dideklarasikan dengan my, lalu diisi dengan daftar nilai (list) yang ditulis di dalam tanda kurung dan dipisah koma. Nama variabelnya menggunakan tanda @, misalnya @hari untuk sekumpulan nama hari. Aturan penamaannya sama dengan variabel skalar, yaitu diawali huruf atau garis bawah dan bersifat peka huruf besar kecil.
Akses satu elemen menggunakan tanda skalar $ diikuti indeks di dalam kurung siku, contohnya $hari[0]. Perl menggunakan angka nol sebagai indeks pertama, sehingga array dengan lima elemen memiliki indeks 0 sampai 4. Indeks negatif dihitung dari ujung belakang, sehingga $hari[-1] selalu menunjuk elemen terakhir tanpa perlu mengetahui panjang arraynya. Penugasan pada satu indeks mengganti nilai elemen tersebut, sedangkan elemen lain tidak berubah. Karena satu elemen diakses melalui tanda skalar, nilainya dapat digunakan di mana pun nilai skalar digunakan, termasuk di dalam string kutip ganda.
Sigil pada akses satu elemen berubah menjadi $ karena hasilnya berupa satu nilai skalar, sehingga tanda di depan menggambarkan jenis hasilnya dan bukan jenis penampungnya. Array hanya menyimpan nilai skalar, dan penugasan satu array ke array lain menyalin seluruh isinya menjadi salinan yang berdiri sendiri, sehingga perubahan pada salinan tidak memengaruhi array asalnya. Apabila dua array ditulis berdampingan seperti (@a, @b), isi keduanya menyatu menjadi satu deret nilai yang rata, karena array tidak membentuk sarang pada penugasan biasa. Struktur bertingkat menuntut referensi, yang tidak dicakup pada topik ini.
use strict;
use warnings;
# deklarasi dan pengisian array dengan daftar nilai
my @hari = ("Senin", "Selasa", "Rabu", "Kamis", "Jumat");
# akses satu elemen dengan tanda skalar dan indeks di dalam kurung siku
print "Elemen pertama : $hari[0]\n";
print "Elemen ketiga : $hari[2]\n";
print "Elemen terakhir: $hari[-1]\n";
# mengganti nilai satu elemen lewat indeksnya
$hari[1] = "Selasa sore";
print "Setelah diganti: @hari\n";Elemen pertama : Senin
Elemen ketiga : Rabu
Elemen terakhir: Jumat
Setelah diganti: Senin Selasa sore Rabu Kamis JumatIndeks terakhir, jumlah elemen, dan rentang#
Perl menyediakan dua besaran yang sering tertukar, yaitu indeks terakhir dan jumlah elemen. Penulisan $#hari menghasilkan indeks terakhir dari @hari, sedangkan fungsi scalar(@hari) menghasilkan jumlah elemennya. Untuk array lima hari kerja, indeks terakhirnya 4 dan jumlah elemennya 5. Kedua nilai itu terikat hubungan tetap, yakni indeks terakhir sama dengan jumlah elemen dikurangi satu, sehingga scalar(@hari) - 1 memberikan hasil yang sama dengan $#hari.
Operator rentang (range operator) membangun list berurutan dari nilai awal sampai nilai akhir. Penulisan (1 .. 5) menghasilkan list berisi lima angka, dan hasilnya dapat langsung ditugaskan ke sebuah array. Rentang ini sering digunakan untuk membuat nomor urut, indeks percobaan, atau daftar angka yang polanya sudah pasti. Apabila nilai akhirnya lebih kecil daripada nilai awalnya, rentang menghasilkan list kosong, sehingga tidak ada elemen yang dibuat.
Nilai $#hari juga boleh ditugaskan kembali. Penugasan $#hari = 2 memangkas array menjadi tiga elemen pertamanya, sedangkan penugasan pada angka yang lebih besar menambah elemen undef pada ujungnya. Bentuk $hari[-1] pada akhirnya setara dengan $hari[$#hari], sehingga keduanya menunjuk elemen yang sama. Operator rentang juga menerima huruf, misalnya 'a' .. 'e' yang menghasilkan lima huruf berurutan melalui kenaikan ajaib (magic increment). Sebaliknya, operator .. pada konteks scalar tidak membentuk rentang, melainkan berperan sebagai operator flip-flop untuk pemindaian berulang, sehingga rentang selalu dibangun pada konteks list.
use strict;
use warnings;
# array lima hari kerja
my @hari = ("Senin", "Selasa", "Rabu", "Kamis", "Jumat");
# $#hari menyimpan indeks terakhir, bukan jumlah elemen
print "Indeks terakhir: $#hari\n";
# jumlah elemen diperoleh dengan fungsi scalar
print "Jumlah elemen : ", scalar(@hari), "\n";
# dua cara menghitung indeks terakhir memberikan hasil yang sama
print "Indeks hitungan: ", scalar(@hari) - 1, "\n";
# operator rentang membuat list berurutan
my @angka = (1 .. 5);
print "Rentang : @angka\n";Indeks terakhir: 4
Jumlah elemen : 5
Indeks hitungan: 4
Rentang : 1 2 3 4 5push, pop, shift, dan unshift#
Empat fungsi berikut mengoperasikan array dari kedua ujungnya tanpa perlu menghitung indeks. Fungsi push menambahkan satu atau lebih elemen pada ujung kanan, sedangkan pop mengambil dan mengembalikan satu elemen dari ujung kanan. Pada ujung sebaliknya, unshift menambahkan elemen pada posisi paling depan, dan shift mengambil satu elemen dari sana. Kombinasi keempat fungsi itu membentuk dua perilaku yang umum, yaitu push dan pop untuk tumpukan (stack) yang masuk pertama keluar terakhir, serta push dan shift untuk antrean (queue) yang masuk pertama keluar pertama.
Diagram berikut merangkum arah kerja keempat fungsi pada kedua ujung array.
use strict;
use warnings;
# array sebagai antrean tiket loket
my @antrean = ("Ali", "Budi");
# unshift menambahkan elemen baru pada ujung kiri
unshift(@antrean, "Citra");
print "Setelah unshift: @antrean\n";
# push menambahkan elemen baru pada ujung kanan
push(@antrean, "Dewi");
print "Setelah push : @antrean\n";
# shift mengambil satu elemen dari ujung kiri
my $dilayani = shift(@antrean);
print "Dilayani : $dilayani\n";
print "Sisa antrean : @antrean\n";
# pop mengambil satu elemen dari ujung kanan
my $pulang = pop(@antrean);
print "Pulang : $pulang\n";
print "Sisa antrean : @antrean\n";Setelah unshift: Citra Ali Budi
Setelah push : Citra Ali Budi Dewi
Dilayani : Citra
Sisa antrean : Ali Budi Dewi
Pulang : Dewi
Sisa antrean : Ali BudiKeluaran skrip memperlihatkan urutan peristiwanya dari atas ke bawah. Antrean diisi dari kedua ujungnya dengan unshift dan push, lalu dikosongkan dengan shift dan pop. Fungsi pop dan shift mengembalikan elemen yang diambil, sehingga nilainya dapat disimpan ke variabel skalar seperti $dilayani dan $pulang. Apabila arraynya sudah kosong, kedua fungsi itu mengembalikan undef tanpa menampilkan peringatan, sehingga hasilnya perlu diuji sebelum digunakan.
Kesalahan umum#
Kesalahan yang paling sering muncul adalah mengakses satu elemen dengan tanda array. Penulisan @hari[1] sah secara sintaks, tetapi maknanya berbeda, yaitu potongan array (array slice) yang mengembalikan list berisi satu elemen, bukan skalar. Dengan use warnings aktif, Perl menampilkan pesan Scalar value @hari[1] better written as $hari[1] sebagai peringatan. Kebiasaan yang benar adalah menggunakan $hari[1] apabila yang dimaksudkan adalah satu nilai.
Kesalahan berikutnya adalah memperlakukan $#hari sebagai jumlah elemen. Array kosong memiliki $#hari bernilai -1, sedangkan jumlah elemennya 0, sehingga kedua besaran itu tidak boleh dipertukarkan. Selain itu, membaca elemen di luar indeks terakhir, misalnya $hari[99], tidak memicu error dan hanya menghasilkan undef. Perl tidak memperpanjang array saat pembacaan, tetapi penugasan pada indeks yang jauh, misalnya $hari[99] = 1, akan menambah banyak elemen undef pada posisi di antaranya.
Ringkasan#
- Array bertanda
@menyimpan list nilai berurutan, sedangkan satu elemennya diakses sebagai skalar dengan$array[indeks], dan indeks negatif menghitung dari ujung belakang. $#arraymemberikan indeks terakhir,scalar(@array)memberikan jumlah elemen, dan keduanya terikat hubungan indeks terakhir sama dengan jumlah elemen dikurangi satu.- Operator rentang
(1 .. 5)membentuk list berurutan yang siap ditugaskan ke array. pushdanpopmengoperasikan ujung kanan,shiftdanunshiftmengoperasikan ujung kiri, sedangkanpopataushiftpada array kosong mengembalikanundef.
Referensi#
- perldata — Perl documentation — Menguraikan array, list, indeks, serta konteks scalar dan list pada struktur data Perl.
- perlfunc — Perl documentation
— Daftar fungsi bawaan Perl, termasuk
push,pop,shift, danunshift.