![]() |
Dasar-dasar Pemograman Perl |
![]() |
|
NAME
NAMEPPP - Pintu Pertama ke Perl (bukan Point to Point Protocol, apalagi Partai Persatuan Pembangunan)$Id: ppperl.pod,v 1.7 1999/03/29 16:55:48 edwin Exp $
SYNOPSISTeks PPP ini ditulis dengan tujuan untuk membantu orang Indonesia yang baru belajar menggunakan Perl. Latar belakang bahasa C akan sangat membantu, meskipun bukan syarat mutlak, akan tetapi pengalaman pemrograman dalam sekurang-kurangnya satu bahasa lain diperlukan. Sebagai bahan tutorial, teks ini dirancang untuk digunakan bersama dengan perlop. Jika dokumen tersebut dirasa sulit dibaca karena terlalu teknis, Appendix A disediakan untuk membantu memahami sejumlah istilah teknis di sana.Rencananya teks ini akan disampaikan sebagai salah satu materi pada Pelatihan/Tutorial Linux KPLI Jateng (Kelompok Pengguna Linux di Indonesia area Jawa Tengah, http://jateng.linux.or.id/), tanggal: m#\d+/\d+/1999#, di STMIK Dian Nuswantoro, Semarang, Indonesia.
1. PENDAHULUAN
1.1 Apa Itu Perl?Menurut Larry Wall (http://www.wall.org/) -penciptanya- Perl adalah akronim dari Practical Extraction and Report Language, atau Pathologically Eclectic Rubbish Lister. Perl diciptakan dengan menggabungkan unsur-unsur dari bahasa C, awk, Bourne shell script, dan program-program seperti sed, grep.Tidak seperti shell script, Perl tidak bergantung pada program-program eksternal, sehingga lebih cepat. Perl adalah setengah kompiler dan setengah interpreter. Jika kita menjalankan sebuah skrip Perl, maka skrip tersebut sebenarnya dikompilasi terlebih dahulu ke dalam bentuk menengah (pohon syntax) yang kemudian diinterpretasikan oleh sistem run-time Perl. Dengan demikian, eksekusi skrip Perl lebih cepat daripada skrip bahasa-bahasa yang murni terinterpretasi (interpreted language) seperti Tcl. Lebih lanjut lagi juga muncul teknik-teknik untuk lebih mempercepat lagi waktu eksekusi skrip Perl. Tidak seperti produk-produk proprietary seperti Java yang tidak pernah lepas dari isu-isu ``politik bisnis'', pengguna Perl bisa dengan tenang dan nyaman menggunakan Perl pada platform favoritnya. Seperti Linux, Perl dapat diperoleh secara bebas, karena berlisensi publik GNU. Oleh para pakar bahasa pemrograman, Perl digolongkan ke dalam VHLL (Very High Level Language). Satu perintah dalam Perl ekivalen dengan banyak perintah dalam bahasa tingkat tinggi, sehingga program-program yang ditulis dalam Perl sangat efisien dan ringkas. Perl merupakan pilihan utama untuk tugas-tugas pengolahan teks, terutama dengan fasilitas regular expression-nya yang sangat canggih. Dengan mewabahnya internet, dengan sejumlah protokolnya yang berbasis teks (NVT ASCII), Perl menjadi pilihan utama untuk pemrograman internet, terutama CGI (Common Gateway Interface). Semula Perl hanya dipakai untuk menulis skrip-skrip pendek, namun dalam perkembangannya, Larry menambahkan dukungan bagi pemrograman berorientasi objek, dan dimulailah era baru pemrograman Perl untuk aplikasi-aplikasi besar dan rumit.
1.2 Membuat dan Mengeksekusi Program PerlGunakan editor teks (vi, jstar, emacs, atau apapun kesukaan Anda) untuk mengedit program Perl, pada baris pertama cantumkan path ke interpreter perl:
#!/usr/bin/perl Simpanlah sebagai file, biasanya dengan ekstensi .pl (tapi ini tidak penting bagi interpreter perl), dan ubah permissionnya ke executable (misalkan chmod 755, atau chmod +x).
1.3 Dokumentasi Perl (perlpod)Dokumentasi biasanya ditulis dalam format pod (Plain Old Documentation), untuk membacanya, gunakan perldoc. Misalkan untuk membaca perlfaq.pod, jalankan:
$ perldoc perlfaq Tersedia juga konverter dari pod ke format-format lain seperti ASCII Text, dan HTML. Sebagai contoh, untuk membuat HTML dari perlfaq1.pod:
$ pod2html --infile=perlfaq1.pod --outfile=perlfaq1.html Sedangkan untuk membuat ASCII Text:
$ pod2text perlfaq1.pod > perlfaq1.txt Untuk menuliskan komentar (comment) pada source code, tuliskan setelah simbol #.
2. DATAUntuk menciptakan variabel, perlu ditentukan tipe data bagi variabel tersebut. Tipe data yang paling mendasar adalah skalar. Sebuah skalar dapat berupa numerik ataupun string. Tipe data lainnya adalah array dari skalar, dan array asosiatif (associative array) dari skalar.
2.1 SkalarVariabel skalar ditulis dengan simbol $. Contoh:
$title = "Programming Perl"; #skalar string $num = 10; #skalar numerik Perhatikan quote (tanda kutip) pada skalar string. Ada tiga macam quote: double quote (seperti pada contoh di atas), single quote, dan back quote. Jika kita gunakan double quote, maka kita izinkan penggunakan control character dan interpolasi variabel pada string tersebut. Berikut ini adalah contoh-contoh control character:
\n newline (baris baru) \r carriage return \t tab Interpolasi variabel berarti bahwa sebuah variabel yang digunakan dalam sebuah string disubstitusi dengan nilai variabel tersebut. Sekarang cobalah contoh berikut:
#!/usr/bin/perl $title = "Programming Perl"; $num = 10; $kalimat = "Jumlah buku $title sebanyak $num.\n"; print $kalimat;
Jika kita gunakan single-quote, maka pada string tersebut tidak berlaku
control character dan interpolasi variabel. Cobalah jalankan kembali contoh
di atas setelah mengganti double-quote pada
$tanggal = `date`; print "Jumlah buku $title pada $tanggal sebanyak $num.\n"; Cara lain untuk menuliskan quote adalah dengan menggunakan q (single-quote), qq (double-quote), dan qx (back-quote). Contoh:
$tanggal = qx[date]; #sama dengan back-quote $title = q/Programming Perl/; #sama dengan single-quote $other = qq#Learning Perl#; #sama dengan double-quote
2.2 ArrayVariabel array ditulis dengan simbol @. Contoh:
@small_nums = (1..20); @authors = ("Larry", "Randal", "Friedl"); @amounts = qw(7 4 6); #sama dengan ('7', '4', '6') Indeks elemen array dimulai dari 0. Contoh:
print $authors[0], "\n"; #mencetak Larry print $authors[2], "\n"; #mencetak Friedl Basis 0 ini sebenarnya dapat diubah dengan cara mengubah nilai $[. Contoh:
$[ = 1; #more convenient to awk folks print $authors[1], "\n"; #mencetak Larry Sekalipun praktek demikian tidak dianjurkan. Untuk mengetahui indeks dari elemen terakhir dari sebuah array, gunakan simbol $#. Contoh:
print 'Indeks elemen terakhir = ', $#authors, "\n";
2.3 Array AsosiatifArray Asosiatif pada perl diimplementasikan sebagai hash table, dan memiliki struktur seperti array, kecuali pada indeksnya yang berupa string, sedemikian rupa sehingga hash tersusun dari pasangan-pasangan key-value. Variabel hash ditulis dengan simbol %. Contoh:
%booklist = ("Larry", "Camel", "Randal", "Llama", "Srinivasan", "Panther",); atau:
%booklist = ("Larry" => "Camel", "Randal" => "Llama", "Srinivasan" => "Panther",); print $booklist{'Larry'}, "\n"; #mencetak Camel
2.4 KonteksOperasi-operasi yang dilakukan terhadap data sebenarnya dilakukan di dalam konteks tertentu, artinya jika hasil yang diharapkan dari sebuah operasi terhadap data atau operand tertentu adalah skalar, maka dikatakan bahwa data atau operand tersebut dievaluasi dalam konteks skalar. Selain konteks skalar, dikenal juga konteks array atau list, dan konteks boolean.
@booklist = %booklist; #menciptakan array dari hash $jumlah_elemen = @authors; #mengambil jumlah elemen array Konteks boolean terutama digunakan dalam mengevaluasi sebuah ekspresi. Nilai SALAH adalah null string (``''), 0, ``0'', atau undef. Variabel yang tidak terdefinisi bernilai undef. Kita akan lihat penerapan konteks boolean pada pembahasan mengenai struktur kendali.
2.5 Referensi dan Variabel AnonimReferensi mirip dengan pointer pada C. Kita dapat menciptakan referensi ke variabel bernama, maupun ke variabel anonim (tak bernama). Untuk menciptakan referensi ke variabel bernama, kita gunakan backslash di depan variabel tersebut. Contoh:
$amount = 7; @beasties = ("Camel", "Llama", "Panther"); %booklist = ("Larry", "Camel", "Randal", "Llama", "Srinivasan", "Panther",);
$amountref = \$amount; #ref ke skalar $beastiesref = \@beasties; #ref ke array $booklistref = \%booklist; #ref ke hash
print ref($amountref), "\n"; print ref($beastiesref), "\n"; print ref($booklistref), "\n";
SCALAR ARRAY HASH Untuk menciptakan referensi ke array anonim, kita gunakan kurung persegi, dan untuk referensi ke hash anonim, kita gunakan kurung kurawal. Contoh:
$ref_to_scalar = \5; $ref_to_arr = [1, 2, 3]; $ref_to_hash = {'satu' => 1, 'dua' => 2, 'tiga' => 3};
print ${$ref_to_scalar}, "\n"; for (@$ref_to_arr) {print $_, "\n";} print 'Elemen ke-0: ', $$ref_to_arr[0], "\n"; print 'Elemen ke-2: ', ${$ref_to_arr}[2], "\n"; print 'Elemen ke-1: ', $ref_to_arr->[1], "\n"; #C style
for (sort keys(%$ref_to_hash)) {print $_, ': ', $$ref_to_hash{$_}, "\n";}
Karena TMTOWTDI (There's More Than One Way To Do It), ada beberapa cara
untuk mengakses elemen dari variabel anonim. Kita dapat menggunakan konteks
yang sesuai dengan tipe referensinya. Misalkan karena
3. STRUKTUR KENDALI
3.1 Blok StatemenAnda tidak perlu membaca bagian ini jika Anda seorang programmer C. Blok statemen adalah rangkaian statemen yang ditempatkan dalam pasangan kurung kurawal. Bentuknya:
{ ....; #statemen pertama ....; #statemen kedua } Perl mengeksekusi statemen berturut-turut mulai dari yang pertama sampai yang terakhir.
3.2 if dan unlessBentuk:
if(EXPR) { ...; #statemen } else { ...: #statemen } atau:
if(EXPR) { ...; #statemen } elsif(EXPR) { ...; } else { ...; } EXPR adalah ekspresi kendali atau kondisional yang dievaluasi dalam konteks boolean (benar atau salah). Blok statemen dieksekusi jika EXPR bernilai benar. Kita dapat menuliskan statemen mendahului if jika statemen hanya satu baris. Contoh:
print "It's there!\n" if ($arrived); selain itu, statemen harus ditulis di dalam blok (tidak seperti pada bahasa C). Sedangkan bentuk penulisan unless sama seperti pada if, di mana unless akan mengeksekusi blok statemen jika EXPR bernilai salah.
3.3 while dan unlessBentuk:
while(EXPR) { ...; }
unless(EXPR) { ...; } while akan mengeksekusi blok statemen berulang-ulang selama EXPR bernilai benar, sedangkan unless justru selama EXPR bernilai salah. Kita akan melihat pemakaian while pada pembahasan mengenai I/O dasar.
3.4 for dan foreachBentuk penulisan for yang pertama mirip seperti pada C:
for (EXPR_AWAL; KONDISI; EXPR_AKSI) { ...; } di mana EXPR_AWAL pertama-tama dieksekusi, lalu berturut-turut blok statemen dan EXPR_AKSI dieksekusi berulang-ulang selama KONDISI terpenuhi. Di sini KONDISI adalah sebuah ekspresi kondisional yang dievaluasi dalam konteks boolean. Contoh:
for ($i = 1; $i < 11; $i++) {print "$i\n";} Bentuk lain:
for (ARRAY) { ...; } Contoh:
for (@scores) {print $_, "\n";}
Pada contoh di atas, for mengiterasi array @scores, dan mengeset variabel
global
foreach $score (@scores) {print $score, "\n";}
4. I/O DASARKita dapat membuat program yang lebih interaktif, artinya yang dapat menerima input dari user, dengan membaca dari STDIN. STDIN adalah filehandle yang disediakan oleh Perl untuk pembacaan dari standard input. Contoh:
$author = <STDIN>; print "Author's name: $author"; @book_title = <STDIN>; for (@book_title) {print join(' ', $_);} Perhatikan bahwa pada konteks array, input akan dibaca terus sampai diterima karakter EOF (Ctrl-D pada Linux). Untuk pemrograman user-interface berbasis teks yang lebih baik, kita dapat menggunakan library curses atau ncurses (new curses) dan modul Curses. Mengenai pemakaian modul akan kita lihat lagi pada bagian Fungsi, Library dan Modul). Kita sering melihat program yang menerima argumen pada command-line, misalkan cat. Kita menjalankan:
$ cat ppperl.txt di mana ppperl.txt adalah argumen yang dilewatkan ke program cat. Kita dapat membuat skrip perl kita bekerja seperti itu dengan menggunakan operator berlian (diamond operator) <>. Contoh:
#!/usr/bin/perl
while(<>) { print $_; } Misalkan script di atas kita beri nama pcat, maka jika kita jalankan:
$ pcat ppperl.txt akan bekerja seperti `cat ppperl.txt`.
Operator berlian membaca data dari file yang kita lewatkan sebagai argumen
pada command-line, dan Dengan memanfaatkan $_, kita dapat menulis pcat di atas lebih ringkas lagi:
while(<>) { print; } atau bahkan:
print while(<>); Jika kita melewatkan argumen pada saat memanggil skrip perl kita, maka sebenarnya argumen-argumen tersebut dibaca pada array @ARGV. Misalkan kita punya skrip perl bernama showargs.pl sbb:
#!/usr/bin/perl
print join(", ", @ARGV); dan kita memanggilnya sbb:
$ showargs.pl Camel Llama Panther maka outputnya: Camel, Llama, Panther
Operator diamond sebenarnya bekerja pada
Authoritative Perl reference book by the creator. --------------- Classic tutorial Perl book by Randal, the JAPH. lalu:
print while(<>); akan mencetak isi file Camel.syn dan Llama.syn berturut-turut. Untuk mengetahui jumlah argumen yg dilewatkan, manfaatkan variabel $#ARGV. Jadi kalau pada showargs.pl kita tambahkan:
print "\nJumlah argumen yg dilewatkan = ", $#ARGV + 1, "\n"; maka: showargs.pl Camel Llama Panther akan menghasilkan output:
Camel, Llama, Panther Jumlah argumen yg dilewatkan = 3.
5. REGULAR EXPRESSION (perlre)
5.1 DasarJika kita bekerja dengan word processor, tentunya sudah akrab dengan fasilitas ``search text'' ataupun ``find and replace.'' Secara sederhana, regular expression atau regex dapat dipahami sebagai fasilitas semacam itu, meskipun jauh lebih berdayaguna seperti yang akan kita lihat nanti. Bagi yang sudah berpengalaman menggunakan grep (= global regular expression parser), regex Perl menyerupai egrep (extended grep). Regex yang kita susun adalah berupa pattern (pola) yang terdiri dari sejumlah item. Kita lihat dulu sebuah contoh,
#!/usr/bin/perl while (<>) { print "$_\n" if (/Regular/); }
/Regular/ di dalam Pola dievaluasi sebagai double-quote string, artinya kita dapat melakukan interpolasi variabel di dalam pola, dan juga dikenali pemakaian control character (ingat pembahasan mengenai double-quote string). Jika pada contoh di atas kita ingin agar pola dapat cocok dengan Regular maupun Reguler, kita dapat menggunakan character class sbb:
/Regul[ae]r/ Jika character class mencakup satu rentang yang panjang, misalkan:
/[0123456789]/ #cocok dengan satu digit bilangan kita dapat menuliskannya sbb:
/[0-9]/ Bentuk negatifnya kita tuliskan dengan simbol ^ di depan:
/[^0-9]/ #cocok dengan _selain_ satu digit bilangan Dengan menggunakan character class, kita pelajari sejumlah konstruk berikut:
Konstruk Nama Ekivalen dengan: \d digit [0-9] \w words [a-zA-Z0-9_] \s whitespaces [ \r\t\n\f] \D non-digit [^0-9] \W non-words [^a-zA-Z_] \S non-whitespaces [^ \r\t\n\f] Untuk pencocokan dengan sembarang karakter kecuali \n, kita gunakan metacharacter titik (.).
5.2 Menggunakan MultiplierMultiplier adalah penentu jumlah berapa kali sebuah item muncul. Ini sangat berguna jika kita ingin menyusun pola pencocokan terhadap item yang jumlah pemunculannya bervariasi (tidak tetap), atau jumlah pemunculannya tetap tapi sangat banyak.
Multiplier Arti * Tidak muncul atau berkali-kali muncul + Muncul minimal satu kali ? Tidak muncul atau muncul satu kali {n} Muncul tepat n kali {n,} Minimal muncul n kali {n,m} n =< jumlah pemunculan =< m Dengan demikian kita lihat bahwa * ekivalen dengan {0,}, + ekivalen dengan {1,}, dan ? ekivalen dengan {0,1}.
5.3 Tanda Kurung sebagai MemoriJika kita gunakan () pada pola pencocokan, maka bagian string yang cocok dengan pola di dalam tanda kurung tersebut akan disimpan dalam variabel$1 untuk tanda kurung pertama, $2 untuk tanda
kurung kedua, dst. Contoh:
@names = ('Larry Wall', 'Es krim Walls'); for (@names) { if (/(.+)\sWall/) { print "$1\n"; } } akan mencetak:
Larry Es krim
5.4 PenjangkaranEmpat konstruk berikut ini berguna untuk ``menjangkarkan'' pola:
Konstruk: Penjangkaran pada: ^ awal baris $ akhir baris sebelum \n \b word boundary (batas word) \B bukan batas word Perhatikan bahwa ^ memiliki arti yang berbeda jika digunakan di dalam character class atau [], begitu juga \b (di dalam [], \b berarti backspace). \b adalah batas di antara dua karakter, di mana salah satu karakter adalah \w dan karakter lainnya adalah \W (urutan bisa dipertukarkan). Sebaliknya, \B berarti bukan batas word. Untuk jelasnya, lihat ini:
@names = ('Larry Wall', 'Es krim Walls'); for (@names) { if (/\bWall\B/) { print "$_\n"; } } akan mencetak:
Es krim Walls karena pada 'Larry Wall', setelah Wall ada batas word.
5.5 Lebih Jauh dengan Operator-operator RegexOperator-operator yang terutama digunakan dengan regex (baca perlop): m//gimosx (seperti //, tapi dengan m// kita dapat menentukan delimiter non-alfanumerik selain forward slash, misalkan m## atau m!!), tr///cds (transliterasi: pemetaan karakter ke karakter lain), s///egimosx (substitusi).Operator pencocokan (m// atau //) jika dievaluasi dalam konteks skalar akan menghasilkan nilai benar (1) jika pencocokan berhasil, atau nilai salah (null string) jika tidak cocok. Jika dievaluasi dalam konteks array, akan mengeset elemen array pertama dengan $1, elemen kedua dengan $2, dst jika pencocokan berhasil. Jika pola pencocokan tidak mengandung tanda kurung, maka elemen array akan diset 1 jika pencocokan berhasil. Operator substitusi (s///) mengganti bagian string yang cocok dengan pola (di sisi kiri) dengan teks penggantinya (di sisi kanan). Contoh:
@names = ('Larry Wall', 'Es krim Walls'); for (@names) { if ($cnt = s/Es krim (Wall)s/Great $1/) { print "$_\nJumlah substitusi: $cnt\n"; } } Keterangan opsi: g = search secara global, jadi lakukan matching untuk semua pemunculan, bukan hanya sekali saja, i = case insensitive matching (tidak pedulikan perbedakan huruf kapital/kecil), m = multiline matching, jadi menerima string yang mengandung banyak \n, o = compile once, satu kali compile, untuk optimasi kecepatan jika tidak ada interpolasi variabel berulang (lebih dari satu kali) dalam pola pencocokan. s = single line matching (default), x = extended regex, jadi boleh menggunakan whitespace (\s) dan comment di dalam regex untuk memudahkan pembacaan, e = evaluasi sisi kanan sebagai ekspresi. Kalau opsi ini tidak kita cantumkan, maka secara default, sisi kanan (RHS = Right Hand Side) dievaluasi sebagai double-quote string. Contoh:
$init = "Linux is an OS an OS\n"; $init =~ s/an OS/a kernel/; print $init; #mencetak: Linux is a kernel an OS Kalau kita tambahkan opsi g, seperti ini:
$init =~ s/an OS/a kernel/g; maka outputnya menjadi:
Linux is a kernel a kernel
Kalau kita ingin agar
($end = $init) =~ s/an OS/a kernel/g; print $end, $init; maka outputnya:
Linux is a kernel a kernel Linux is an OS an OS Berikut ini adalah sebuah contoh penerapan regex untuk mengoreksi format Nomor Induk Mahasiswa: Aplikasi basis data di sebuah Perguruan Tinggi dari tahun ke tahun ditulis dalam sistem yang berganti-ganti, oleh orang yang berbeda, dan untuk kebutuhan yang berbeda juga. Ketika diadakan pembenahan sistem, nampak inkonsistensi pada field NIM. Format yang diharapkan adalah dua digit nomor angkatan, titik, dua digit kode program studi, titik, empat digit nomor mahasiswa. Setelah data pada field tersebut dipelajari, dapat dihimpun sample data sebagai berikut (untuk kode prodi tertentu):
91.30. 880 91 30 880 91 30 880 91 880 91.880 91. 880 91 0880 91.0880 91 303 91.30.880 91-30-880 91-30-0880 91.30.0880 Karena banyaknya record yang harus diproses (dimulai dengan mahasiswa angkatan 1988), dan terbatasnya kemampuan ``find and replace'' yang dimiliki database, maka diperlukan cara lain. Jika masalah pengaksesan database kita abaikan, dan kita berkonsentrasi pada masalah pengolahan string-nya, cobalah selesaikan dengan regex Perl. Di bawah ini adalah salah satu cara dengan dua baris regex Perl:
while (<>) { $prodi = "30"; s/^(\d\d)\D+(\d+)$/$1.$prodi.$2/; s!^(\d\d)\D(\d\d)\D+(\d+)$!$1.".".$2.".".sprintf("%04d", $3)!e; print; }; Bingung? Ini adalah bentuk yang lebih mudah dibaca:
while (<>) { $prodi = "30"; s/ ^ ( \d\d #angkatan ) \D+ #delimiter ( \d+ #no. mhs ) $ /$1.$prodi.$2/x; #sisipkan kode prodi, #izinkan pencatuman comment dalam matching pattern
s! ^ ( \d\d ) \D (\d\d) \D+ #delimiter antara kode prodi dan nomor (\d+) #mhs bisa lebih dari satu non-digit char $ ! $1.".".$2.".".sprintf("%04d", $3) #bentuk kembali dalam format yg benar !xe; #evaluasi sisi kanan sbg ekspresi
print; }; Regex yang pertama menyisipkan kode prodi, jika data belum mengandung kode prodi, lalu regex kedua memisahkan digit dari non-digit, memformat nomor mhs dalam empat digit, dan menyatukannya kembali dengan delimiter berupa titik. Cobalah mengerjakannya dalam bahasa lain seperti C, Pascal, atau Basic :-) Jika operator substitusi nampak begitu berdayaguna, namun untuk penggantian karakter lebih efisien menggunakan operator tr///. Contoh:
$_ = "papi pipa da sini."; tr/ai/ia/; print "$_\n"; akan mencetak:
pipa papi di sana. Opsi-opsi untuk operator tr/// silakan Anda pelajari di perlop.
5.6 AlternasiJika terhadap sebuah string kita ingin mencocokkan lebih dari satu pola, maka kita gunakan operator alternasi (|). Untuk menggunakan ini kita harus perhatikan urutan prioritas dari operator maupun item dalam kaitannya dengan pengelompokan (grouping).
Nama Simbol -------------------------------- Tanda kurung () Multiplier +*?{m,n} Sequence dan jangkar abc^$\b\B Alternasi | Berikut ini adalah contoh pemakaian operator alternasi:
/E|Addwin/; #Berbahaya! Lihat output script di bawah /(E|Ad)dwin/; #cocok dengan Edwin atau Addwin, tapi juga mengeset $1 /(?:E|Ad)dwin/; #seperti di atas, tapi tidak mengeset $1. /(?:[Ee]|[Aa]d)dwin/; #cocok juga dengan edwin atau addwin Untuk jelasnya, kita coba script berikut:
@names = qw/Eddwin Edwin Ewin Ein Ei En E Addwin edwin addwin Adwin/; @patts = qw/E|Addwin (E|Ad)dwin (?:E|Ad)dwin (?:[Ee]|[Aa]d)dwin/;
foreach $patt (@patts) { for (@names) { if (/$patt/) { print "/$patt/ cocok dengan $_\n"; if (defined($1)) {print '$1 bernilai: ', "$1\n";} } } } Outputnya:
/E|Addwin/ cocok dengan Eddwin /E|Addwin/ cocok dengan Edwin /E|Addwin/ cocok dengan Ewin /E|Addwin/ cocok dengan Ein /E|Addwin/ cocok dengan Ei /E|Addwin/ cocok dengan En /E|Addwin/ cocok dengan E /E|Addwin/ cocok dengan Addwin /(E|Ad)dwin/ cocok dengan Edwin $1 bernilai: E /(E|Ad)dwin/ cocok dengan Addwin $1 bernilai: Ad /(?:E|Ad)dwin/ cocok dengan Edwin /(?:E|Ad)dwin/ cocok dengan Addwin /(?:[Ee]|[Aa]d)dwin/ cocok dengan Edwin /(?:[Ee]|[Aa]d)dwin/ cocok dengan Addwin /(?:[Ee]|[Aa]d)dwin/ cocok dengan edwin /(?:[Ee]|[Aa]d)dwin/ cocok dengan addwin
6. FUNGSI, LIBRARY, DAN MODUL
6.1 FungsiSebuah subrutin atau fungsi memiliki bentuk sebagai berikut:
sub foo { ........ #tuliskan kode di sini } di mana foo adalah nama subrutin. Argumen-argumen yang dilewatkan ke subrutin dibaca melalui array @_. Contoh:
sub foo { my($arg1, $arg2) = @_; print "$arg1\n$arg2\n"; }
Variabel
sub banding { my($arg1, $arg2) = @_; $arg1 > $arg2 ? 1 : ($arg1 < $arg2 ? -1 : 0); }
Sebenarnya sebuah subrutin dapat mengembalikan tidak hanya skalar, tapi
juga array, array asosiatif, dan beberapa macam lainnya. Untuk pembahasan
lebih lengkapnya, baca perlsub. Fungsi
@scores = (68, 50, 30, 78, 5, 58); @sorted_scores = sort by_num @scores; print join(' ', @sorted_scores), "\n";
sub by_num { banding($a, $b); #subrutin banding() seperti di atas }
Di sini kita lihat bahwa subrutin yang dilewatkan ke
sub by_num { $a <=> $b; #operator spaceship }
Cobalah membuat sorting descending (dari besar ke kecil) dari array
Berikut ini adalah contoh lain penerapan
@students = (['joko', 60, 18], ['kabayan', 50, 20], ['acong', 50, 20], ['sitorus', 70, 20], ['ali', 70, 18]);
sub by_rank { $b->[1] <=> $a->[1] || $a->[2] <=> $b->[2] || $a->[0] cmp $b->[0]; }
@students = sort by_rank @students;
for (@students) { print $_->[0], ' ', $_->[1], ' ', $_->[2], "\n"; }
6.2 Library dan ModulSebelum OOP (Object Oriented Programming) dimasukkan ke Perl, library adalah cara yang terutama dipakai untuk menangani pemakaian kode secara berulang. Perbedaan utama antara library dan modul terletak pada enkapsulasi. Untuk menggunakan sebuah library, gunakan require. Contoh:
require "find.pl"; Sedangkan untuk menggunakan sebuah modul, kita biasanya menggunakan use, meskipun sebenarnya bisa juga menggunakan require (dengan beberapa perbedaan penting, untuk jelasnya baca perlfaq8). Saat ini modul dirasakan lebih memadai karena semakin kuatnya kecenderungan untuk menggunakan perl pada pengembangan aplikasi-aplikasi besar, dan semakin banyaknya kode OOP (yang membutuhkan enkapsulasi yang memadai, yang mana hal ini didukung pada pemakaian modul). Daftar modul ``resmi'' dapat dilihat pada situs CPAN (Comprehensive Perl Archive Network) http://www.perl.com/CPAN-local/. Dokumentasi sebuah modul biasanya menyatu (embedded) pada modul tersebut, dan ditulis dalam format pod. Sebagai contoh, misalkan kita ingin membaca dokumentasi modul Getopt::Std, maka:
$ perldoc Getopt::Std Simbol :: berkaitan dengan letak modul tersebut di dalam direktori lib Perl. Cobalah Anda jalankan:
$ perl -V
dan lihat array Sekarang kita akan menggunakan modul Getopt::Std untuk memproses switch pada baris perintah (command-line). Modul ini juga mendukung clustering (pengelompokan) switch.
#!/usr/bin/perl
use Getopt::Std;
$options = 'o:n:d:f'; getopts $options or die; print $opt_o, "\n"; print $opt_n, "\n"; print $opt_d, "\n"; print $opt_f, "\n";
edwin@skserver:~>> usestd -foMf -nmf -d/var/lib/ Mf mf /var/lib/ 1
Pada contoh di atas kita melihat switch clustering pada -fo yang sebenarnya
adalah dua switch yang terpisah: Lebih baik adalah dengan menggunakan hash:
#!/usr/bin/perl
use Getopt::Std;
$options = 'o:n:d:f'; %options = ();
getopts($options, \%options) or die; for (sort keys %options) { print "$_: ", $options{$_}, "\n"; } yang jika dijalankan sebagai script usestd1, hasilnya adalah:
edwin@skserver:~>> usestd1 -foMf -nmf -d/var/lib/ d: /var/lib/ f: 1 n: mf o: Mf
7. SWITCH BARIS-PERINTAH (perlrun)Perl memiliki sejumlah pilihan atau opsi yang dapat kita tentukan dengan melewatkan switch baris-perintah pada interpreter perl. Di sini kita lihat beberapa switch yang banyak digunakan.
-v mencetak versi perl yang terinstall
-V mencetak konfigurasi perl pada sistem Anda
-c Compile only, check syntax error.
-w Warning.
-n Kita dapat membuat skrip yang bekerja seperti program cat, sebagai berikut:
#!/usr/bin/perl while(<>) { print; }
Dengan opsi
#!/usr/bin/perl -n print;
-p
Opsi ini mirip seperti
#/usr/bin/perl -p
-e Dengan switch ini, perl tidak akan mencari namafile script, dan sebaliknya akan langsung mengeksekusi baris yang mengikutinya. Contoh:
$ perl -ne 'print' Camel.syn Llama.syn atau:
$ perl -pe '' Camel.syn Llama.syn akan mencetak isi file Camel.syn dan Llama.syn
-0 Digunakan untuk menentukan input record separator berupa bilangan oktal. Efeknya seperti mengeset $/ (yang default-nya adalah \n). Misalkan:
$ perl -n00 -e 'print "Record ke-", ++$i, ":\n$_\n"' ppperl.txt Switch -00 akan mengeset $/ = ``'', atau blank-line. Jika pergantian paragraph ditandai dengan satu baris kosong (blank-line), maka pembacaan satu record akan sama dengan pembacaan satu paragraph. Maka dari itu sering dikatakan bahwa switch -00 mengaktifkan modus paragraf. Nilai -0777 akan membaca seluruh isi file sebagai satu record.
-i Berguna untuk melakukan pengubahan langsung pada teks yang sedang diolah. Misalkan kita punya script berikut bernama rmcr:
#!/usr/bin/perl -p s/\r\n/\n/; yang membuang karakter CR (Carriage Return) pada akhir baris sebuah file teks, maka untuk menggunakannya adalah sbb:
$ rmcr the_file.txt > the_file.new
Lebih baik kalau pengubahan itu dilakukan langsung terhadap the_file.txt,
dan ini dapat dilakukan dengan opsi
$ perl -pi.old -e 's/\r\n/\n/' the_file.txt
.old yang mengikuti opsi
-d mengaktifkan symbolic debugger perl.
8. PENUTUPSaat ini pemakaian Perl telah berkembang pesat pada berbagai platform (http://www.perl.org/cgi-bin/survey/): AIX, Amiga, Digital UNIX, FreeBSD, HP-UX, IRIX, Linux, OS/2, Solaris, Win32, (dan masih banyak lagi), dan untuk berbagai keperluan yang sama sekali tidak terbayangkan ketika ia diciptakan.Masih banyak yang belum tercakup dalam teks ini yang sekedar bermaksud menyediakan pengetahuan awal bagi orang yang ingin mengenal Perl lebih dalam. Penulis menyarankan sebagai bacaan lebih lanjut adalah buku-buku klasik seperti Programming Perl (Larry Wall dan Randal Schwartz), Learning Perl (Randal Schwartz dan Tom Christiansen), Advanced Perl Programming (Sriram Srinivasan), meskipun sulit didapat dan muahall :-( Juga wajib dipelajari adalah perlfaq. Perlu rajin dipelajari adalah perl manpage.
9. APPENDIX
A. Membaca perlopAppendix ini ditujukan untuk membantu mempelajari perlop, yaitu manual Perl yang membahas operator-operator.Dari jumlah operand-nya, dibedakan jenis-jenis operator unary (1 operand), binary (2 operand), dan ternary (3 operand). Fungsi (subrutin) bisa ditulis sebagai operator unary, sebagai contoh:
chdir("new-dir"); #sebagai fungsi chdir "new-dir"; #sebagai operator Maka dari itu, dalam perlop kita menjumpai istilah operator unary bernama untuk menyebut operator-operator yang juga bisa digunakan sebagai fungsi, dan operator unary simbolik. Contoh operator unary simbolik adalah ++, dan --.
Operator-operator tertentu menerima operand berupa list (array), sehingga
dikenal juga istilah operator list. Sebagai contoh adalah fungsi atau
operator
print('Cuma contoh.', "\n"); #sebagai fungsi print 'Cuma contoh.', "\n"; #sebagai operator Kemudian pada bagian SYNOPSIS di perlop, kita melihat tabel tingkat prioritas (precedence) dan asosiativitas. Entri teratas adalah operator-operator dengan tingkat prioritas paling tinggi. Asosiativitas menjadi penting kalau sebuah ekspresi melibatkan beberapa operator yang tingkat prioritasnya sama. Untuk jelasnya, kita lihat entri teratas dari tabel tersebut:
left terms and list operators (leftward) Ini berarti bahwa term dan operator-operator list memiliki asosiativitas left, yaitu evaluasi akan dilakukan dari kiri ke kanan. Kemudian ada catatan juga bahwa precedence dan asosiativitas tersebut berlaku untuk operator list dilihat dari sisi kiri (leftward). Jika kita perhatikan dalam tabel tersebut, operator list muncul lagi dengan tingkat prioritas yang jauh lebih rendah, jika dilihat dari sisi kanan (rightward). Contoh:
@ary = (0, 3, sort 4, 2, 1);
Penjelasan: Yang termasuk dalam term antara lain adalah variabel, operator-operator quote, ekspresi yang dituliskan dalam tanda kurung, dan fungsi. Contoh:
@ary = (0, 3, sort(4, 2), 1); for(@ary){print "$_ ";} menghasilkan: 0, 3, 2, 4, 1.
B. URL-URLBerikut ini adalah beberapa URL berkaitan dengan Perl:
Situs-situs utama: The Perl Journal, memuat juga arsip kontes-kontes yang pernah diselenggarakan: http://www.tpj.com/
Perl Mongers, users groups Perl: http://www.pm.org.
Perl/Tk, pemrograman X-Window dengan Perl: Proyek integrasi web server Apache dengan Perl: http://perl.apache.org/mod_perl Kolom Randal L. Schwartz di WebTechniques: http://www.stonehenge.com/merlyn/WebTechniques/ Jeffrey Friedl, sang regex Guru: http://enterprise.ic.gc.ca/~jfriedl/perl Far More Than Everything You've Ever Wanted To Know (about Perl): http://language.perl.com/CPAN/doc/FMTEYEWTK/index.html
10. PENULIS DAN COPYRIGHTCopyright (c) 1999, Edwin Pratomo. All rights reserved. Send any comments, suggestions to ed.pratomo@computer.org.
|