Saat ini Anda sudah mengenal tiga jenis tipe variabel di
Perl, yaitu skalar, array, dan hash. Namun Perl juga mengenal suatu tipe skalar yang khusus yang
dinamakan dengan referensi. Jika suatu variabel
menampung suatu nilai, maka referensi berisi alamat atau penunjuk ke suatu
nilai. Jika dianalogikan dengan sebuah buku, variabel
berisi nilai seperti sebuah halaman buku berisi informasi di dalamnya,
sedangkan referensi merupakan petunjuk, seperti sebuah halaman buku yang hanya
berisi “lihat halaman 2706”.
Tapi apa gunanya referensi? Berguna sekali. Di Perl, kita tidak bisa membentuk struktur
data rumit tanpa adanya referensi. Saya akan membahas
referensi untuk struktur data yang rumit di edisi yang lain, untuk saat ini
saya hanya akan menunjukkan apa itu referensi dan kegunaannya dalam subrutin
yang memerlukan pass by reference.
Anda akan lebih mudah memahami
referensi dari contoh:
$nama = "feynman"; $n = \$nama; print $n;
Hasil
program di atas, mungkin seperti ini:
SCALAR(0x8104b8c)
Angka
di dalam kurung tidak selalu sama, tergantung lokasi
memori variabel $nama di proses
program Perl. Variabel $n berisi
alamat (dan tipe) dari variabel $nama. Operator untuk mengambil
alamat suatu variabel adalah \ (backslash). Untuk mengakses nilai yang
ditunjuk oleh $nama,
kita melakukannya dengan:
print ${$n};
atau bisa juga dengan:
print $$n;
Jika
kita mengubah nilai $$n,
ternyata kita juga mengubah nilai $nama, contoh:
$nama = "feynman"; $n = \$nama; print "Sebelum: ${$n}\n"; $$n="richard"; print "Sesudah: $nama\n";
potongan kode di atas akan mencetak tulisan:
Sebelum: feynman Sesudah: richard
Kenapa itu bisa terjadi? Akan saya coba jelaskan
dengan menggunakan analogi buku tadi. Jika Anda hanya memberikan salinan
variabel seperti ini:
$a = 1982; $b = $a;
maka $b akan
berisi nilai $a, sama seperti
Anda memberikan salinan sebuah halaman buku ke seseorang. Maka jika Anda
mengubah nilai $b, seperti ini:
$b = 1980;
nilai $a
tetap 1982, karena yang diubah adalah salinan variabel (seperti jika salinan
halaman buku itu diubah, halaman aslinya tidak akan berubah). Tapi jika yang
diberikan ke orang lain adalah petunjuk di mana
informasi tersebut berada (referensi), misalnya halaman 1705, maka orang yang
diberi informasi bisa mengubah isi halaman buku tersebut karena tahu letaknya.
Referensi tidak hanya menunjuk ke variabel skalar, tapi juga ke
variabel array atau hash. Untuk array, Anda bisa melakukan ini:
@superhero = ("spiderman", "superman", "batman"); $super = \@superhero;
Jika
Anda hanya perlu referensi ke suatu array, Anda tidak perlu membuat dulu
variabel arraynya, Anda bisa menggunakan notasi [ isi list ] jadi yang di atas bisa disingkat
menjadi:
$super = ["spiderman", "superman", "batman"];
untuk mengakses nilai array tersebut, Anda bisa melakukannya
seperti ini:
@hero = @$super;
untuk mengakses elemennya, Anda bisa menggunakan salah satu
cara ini:
$spiderman = ${$super}[0]; $superman = $super->[1];
Kita lewatkan dulu pembahasan mengenai array dua dimensi untuk
edisi ini. Dan mari melangkah ke hash. Anda
bisa melakukan hal yang sama terhadap hash, seperti
yang Anda lakukan terhadap array. Bedanya adalah kalau untuk array kita memakai
operator [...], maka untuk
membuat referensi ke hash tidak bernama (anonim), Anda melakukannya dengan
notasi {...} seperti ini:
$warna = { "bunga" => "merah", "bola" => "putih" };
Dan
tentunya referensi ke hash diakses dengan:
%lili = %{$bcd};
Dan
bahkan referensi ke suatu subrutin dapat dibuat, seperti ini:
sub test { print "test"; } $a = \&test;
untuk memanggil subrutin tersebut:
&$a();
Pass by Value dan Pass
by Reference
Anda sudah
belajar bahwa di Perl, parameter untuk suatu subrutin diakses dengan array @_. Namun di
edisi yang lalu saya hanya memberi contoh jika parameter yang dilewatkan ke
subrutin adalah nilai skalar. Jika nilai yang dilewatkan adalah list
atau hash, hasilnya mungkin tidak akan seperti yang
Anda harapkan, lihat contoh ini:
sub hello { my ($greet, $name) = @_; print "Selamat $greet, $name\n"; } hello("Pagi", "Donna"); @l = ("Malam", "Lala"); hello(@l); hello("Siang", @l); $waktukerja{"yuni"}="malam"; hello(%waktukerja);
Output
program tersebut adalah:
Selamat Pagi, Donna Selamat Malam, Lala Selamat Siang, Malam Selamat yuni, malam
Seperti
yang Anda lihat, Perl akan “mendangkalkan” list ketika
dilewatkan ke suatu subrutin.
@l=("romeo”, ”juliet"); hello(@l);
sama saja dengan
hello($l[0], $l[1]);
Semua
parameter akan diberikan ke @_ secara berurutan. Hal
ini berlaku baik untuk hash, array, skalar, ataupun gabungan dari semua itu.
Lalu masalahnya? Masalahnya adalah Anda tidak bisa
memberikan array atau hash ke suatu subrutin dalam bentuk yang sebenarnya.
Perl hanya mendukung parameter subrutin berupa skalar, namun
seperti yang kita ketahui, ada suatu tipe skalar khusus yang disebut referensi,
kita bisa menggunakan sifat referensi untuk membuat subrutin yang bisa mengakses
dan memodifikasi array atau hash yang kita berikan. Cara melewatkan
parameter seperti itu (memakai referensi) disebut pass by reference, sedangkan jika yang dilewatkan hanya nilainya
maka disebut pass by value.
Lihat
contoh ini:
sub add_me { my ($arr) = @_; push @$arr, "me"; } @a = qw(joe nitnotz); add_me(\@a); print join(" ", @a);
Subrutin
add_me akan
menambahkan elemen “me” ke
array, sehingga output program adalah:
joe nitnotz me
Jika
Anda membuka kembali tutorial bagian 2, Anda akan mendapati
bagaimana cara mendapatkan daftar user di Unix. Sebagai latihan Anda bisa
memanfaatkan kode itu untuk membuat subrutin yang akan
mengisikan daftar user yang ada pada sistem ke sebuah list. Sehingga Anda bisa
melakukan seperti ini:
get_user_list(\@users); foreach (@users) { #lakukan sesuatu di sini }
Subrutin semacam itu bisa Anda pakai di berbagai program yang
berhubungan dengan administrasi sistem.
http://www.master.web.id/mwmag/issue/06/content/tutorial-perl-5/tutorial-perl-5.html
Tidak ada komentar:
Posting Komentar