Senin, 07 April 2014

Referensi di Perl

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