Tanda kutip ganda pada Perl tidak sekadar membungkus teks, melainkan menafsirkan nama variabel di dalamnya dan menggantikannya dengan nilai. Proses itu disebut interpolasi, dan array serta hash mengikuti aturan tersendiri pada proses ini. Topik ini membahas interpolasi array utuh dan satu elemennya, interpolasi elemen hash, pengaturan pemisah antarelemen, pengawalan karakter @ dan $, serta pemisahan nama variabel dengan kurung kurawal.
Menginterpolasi array dan elemennya#
Array yang ditulis utuh dalam string kutip ganda menginterpolasi seluruh elemennya, dipisah oleh isi variabel khusus $". Nilai awal $" adalah satu spasi, sehingga "@alat" menghasilkan daftar yang dipisah spasi. Variabel ini dapat diubah sementara dengan local di dalam sebuah blok, sebagaimana pemisah koma pada skrip berikut, dan setelah blok berakhir pemisah kembali ke nilai awalnya.
Akses satu elemen tetap menggunakan bentuk skalar, yaitu $alat[0] di dalam string. Elemen hash mengikuti pola yang sama dengan kurung kurawal, yaitu $stok{pensil}. Kedua bentuk itu dibatasi secara alami oleh kurung siku dan kurung kurawalnya, sehingga teks sesudahnya tidak ikut terbaca sebagai bagian nama variabel. Perlu dicatat bahwa yang diinterpolasi hanyalah elemennya, bukan hash utuhnya. Penulisan %stok di dalam string tetap tampil sebagai teks %stok, karena nama hash tidak diinterpolasi oleh tanda kutip ganda.
Interpolasi hanya terjadi pada string kutip ganda, sedangkan string kutip tunggal menampilkan teksnya apa adanya. Array yang belum berisi apa pun menginterpolasi menjadi string kosong tanpa peringatan, sehingga "@kosong" sama saja dengan string kosong. Nilai setiap elemen dikonversi menjadi teks pada saat interpolasi, dan elemen yang bernilai undef tampil sebagai string kosong dengan peringatan Use of uninitialized value apabila use warnings aktif. Karena perilaku ini, keluaran kosong pada pencetakan array patut dicurigai sebagai array yang belum terisi.
use strict;
use warnings;
# array dan hash yang akan diinterpolasi
my @alat = ("pensil", "penghapus");
my %stok = (pensil => 24, penghapus => 7);
# array dalam tanda kutip ganda: seluruh elemen dipisah spasi
print "Daftar alat : @alat\n";
# satu elemen array diakses langsung di dalam string
print "Alat pertama : $alat[0]\n";
# elemen hash diakses lewat kuncinya di dalam string
print "Stok pensil : $stok{pensil}\n";
# variabel khusus $" menentukan pemisah antarelemen
{
local $" = ", ";
print "Pemisah koma : @alat\n";
}Daftar alat : pensil penghapus
Alat pertama : pensil
Stok pensil : 24
Pemisah koma : pensil, penghapusMengawali @ dan $ dengan garis miring terbalik#
Interpolasi menuntut kewaspadaan pada teks yang memang mengandung karakter @ atau $, seperti alamat surel atau harga. Apabila @ langsung diikuti huruf, Perl membacanya sebagai nama array, dan pada disiplin use strict pembacaan itu berujung error kompilasi karena variabel tersebut tidak pernah dideklarasikan. Peraga berikut memperlihatkan error yang muncul ketika karakter @ pada alamat surel tidak diawali garis miring terbalik.
# peraga error ketika @ tidak diawali garis miring terbalik
perl -e 'use strict; use warnings; print "Surel: [email protected]\n";' 2>&1Possible unintended interpolation of @kampus in string at -e line 1.
Global symbol "@kampus" requires explicit package name (did you forget to declare "my @kampus"?) at -e line 1.
Execution of -e aborted due to compilation errors.Perl menyiapkan dua pesan sekaligus, yaitu peringatan unintended interpolation yang menunjuk teks bermasalah dan pesan Global symbol yang menjelaskan akar masalahnya. Perbaikannya sederhana, yaitu menulis admin\@kampus.example sebagaimana skrip berikut. Karakter $ mendapat perlakuan yang sama, sehingga karakter dolar yang dimaksudkan sebagai teks ditulis \$ terlebih dahulu.
Error kompilasi tersebut justru merupakan bentuk perlindungan. Tanpa disiplin use strict, nama @kampus yang tidak pernah dideklarasikan tetap diterima, dan karena arraynya kosong, skrip mencetak admin.example tanpa satu pun peringatan. Kehilangan sebagian teks seperti ini jauh lebih sulit ditemukan daripada error yang menghentikan program di awal. Interpolasi sendiri hanya terpicu apabila @ diikuti langsung huruf atau garis bawah, sehingga admin@ kampus dengan spasi di antaranya tetap tampil apa adanya.
use strict;
use warnings;
# karakter @ diawali garis miring terbalik agar tidak dianggap nama array
my $surel = "admin\@kampus.example";
print "Surel: $surel\n";
# karakter $ juga diawali garis miring terbalik bila ingin tampil apa adanya
my $harga = 3000;
print "Harga: \$$harga\n";Surel: [email protected]
Harga: $3000Memisahkan nama variabel dengan kurung kurawal#
Nama variabel dalam string berhenti pada karakter yang bukan huruf, angka, atau garis bawah. Karena itu, teks yang menyatu dengan nama variabel perlu dipisahkan secara eksplisit. Penulisan ${tahun}A membaca variabel $tahun lalu menyambung huruf A, sedangkan penulisan tanpa kurung kurawal akan dibaca sebagai variabel bernama $tahunA yang belum pernah dideklarasikan. Aturan yang sama berlaku pada elemen array, yaitu $alat[0] boleh langsung diikuti teks karena kurung sikunya yang membatasi nama.
Untuk elemen hash, kurung kurawal kuncinya sudah menjadi batas alami, sehingga $absen{Ali} kali tidak memerlukan pemisah tambahan. Bentuk kurung kurawal yang lebih rumit, seperti ${\...} untuk dereferensi langsung, tidak diperlukan pada tahap ini, karena kebutuhan yang lazim sudah terjawab oleh escape dan kurung kurawal biasa. Pemisahan dengan spasi tentu tidak memerlukan trik apa pun, sehingga kurung kurawal hanya relevan apabila teksnya benar-benar menyatu dengan nama variabel.
Aturan pembacaan nama variabel mengambil deretan karakter terpanjang yang terdiri atas huruf, angka, dan garis bawah, sehingga akhiran berupa angka pun ikut terbaca. Penulisan $absen3 pada string dibaca sebagai nama variabel yang berbeda, yaitu absen3, dan bukan nilai $absen yang disambung angka 3. Kurung kurawal memutus pembacaan itu tanpa mengubah nilai apa pun, sehingga ${absen}3 menghasilkan gabungan yang dimaksudkan. Bentuk ini mirip dengan kurung kunci hash, tetapi fungsinya berbeda, karena kurung pada ${absen} hanya membatasi nama, sedangkan kurung pada $absen{Ali} menunjuk satu entri hash.
use strict;
use warnings;
my $tahun = 2026;
my %absen = (Ali => 3);
# kurung kurawal memisahkan nama variabel dari teks yang menyatu dengannya
print "Angkatan ${tahun}A\n";
# kurung kurawal kunci hash sudah menjadi batas alami dalam string
print "Ali absen $absen{Ali} kali\n";Angkatan 2026A
Ali absen 3 kaliKesalahan umum#
Kesalahan pertama adalah lupa mengawali karakter @ pada teks seperti alamat surel, yang berujung error kompilasi pada disiplin use strict. Kesalahan kedua adalah menulis %hash di dalam string dan mengira seluruh hash akan tercetak, padahal nama hash tidak diinterpolasi dan teksnya tampil apa adanya. Keluaran berisi %stok yang tidak tersubstitusi ini mudah lolos pada skrip yang panjang, sehingga pencetakan hash selalu dilakukan melalui kuncinya, misalnya dalam perulangan foreach keys.
Kesalahan ketiga adalah menyatukan nama variabel dengan satuan atau akhiran tanpa pemisah, yang diam-diam mengarah ke variabel lain yang berbeda. Kasus ini tidak selalu berhenti sebagai error, karena variabel hasil bacaan itu mungkin sah pada bagian lain skrip, tetapi nilainya undef dan memicu peringatan uninitialized value ketika dicetak. Kurung kurawal pada nama variabel merupakan penyelesaiannya, dan kebiasaan menuliskannya sejak awal mencegah kesalahan semacam ini.
Ringkasan#
- String kutip ganda menginterpolasi array utuh dengan pemisah
$", satu elemen array melalui$array[indeks], dan elemen hash melalui$hash{kunci}. - Karakter
@dan$yang dimaksudkan sebagai teks harus diawali garis miring terbalik, dan kelalaian pada@berujung error kompilasi di bawahuse strict. - Nama variabel yang menyatu dengan teks dipisahkan dengan kurung kurawal, sedangkan kurung siku dan kurung kurawal subscript sudah menjadi batas alami.
- Nama hash tidak diinterpolasi, sehingga pencetakan hash dilakukan melalui kuncinya.
Referensi#
- perlop — Perl documentation — Uraian operator kutip ganda beserta aturan interpolasi dan escape pada string.
- perlvar — Perl documentation
— Uraian variabel
$"dan variabel khusus lain yang terlibat dalam interpolasi.