Anda di halaman 1dari 11

Dasar CGI-Perl

Oleh : Prasaja Wikanta


antok@hotmail.com prasaja@students.itb.ac.id

Di tulisan ini, kita akan belajar mengenai bahasa pemrograman Perl dan pemakaiannya di CGI. Fungsi CGI adalah membuat sebuah halaman web menjadi lebih interaktif. Jika kita melihat sebuah buku tamu, counter pada sebuah halaman web, berarti site tersebut menggunakan CGI.

Variabel pada Perl


Ada tiga macam variabel pada Perl, yaitu scalars, arrays dan hashes : Scalars Variabel ini menyimpan hanya satu nilai. Variabel ini dimulai dengan tanda $.
$ayam = 1; $telo = ayam; $celeng = 3.43241;

Kita tidak perlu mendefinisikan jenis variabelnya (string, integer dll), kita tinggal langsung masukkan. Kita juga bisa menggabungkan variabelvariabel tersebut.
#!usr/bin/perl $tujuan = malang; print Boleh tahu nama anda ? ; $nama = <STDIN>; chomp ($nama); print Halo $nama. Silahkan pergi ke $tujuan\n;

Baris pertama menunjukkan lokasi program Perl anda. Bisa anda cari dengan mengetikkan locate perl di prompt.. Fungsi print adalah untuk menampilkan di layar. \n berarti ganti baris. Baris keempat memerintahkan program untuk menunggu input dari pemakai, dan hasil inputnya akan diletakkan di variabel $nama. Fungsi chomp adalah untuk menghilangkan karakter enter ketika kita memasukkan input.

Arrays Variabel ini menyimpan daftar nilai-nilai, jadi lebih dari satu. Variabel ini dimulai dengan tanda @.

#!usr/bin/perl @makanan = (ayam,telo,celeng); print $makanan[0]\n; print $makanan[2]\n; foreach $i (@makanan) { print $i\n; }

Nilai pada variabel arrays dimulai dengan 0. Fungsi foreach pada baris terakhir adalah membaca tiap nilai dari variabel @makanan dan mengeksekusi perintah di dalam tanda {}. Ada beberapa fungsi untuk memanipulasi variabel arrays.

pop(@makanan) shift(@makanan) push(@makanan,coklat) sort(@makanan) reverse(@makanan) scalar(@makanan) join(@makanan)

Mengeluarkan nilai terakhir, yaitu celeng. Isi @makanan tinggal telo dan celeng. Mengeluarkan nilai pertama, yaitu ayam. Menambahkan coklat pada isi @makanan. Urutkan sesuai alfabet. Kebalikan sort. Untuk mengetahui jumlah nilai yang ada di dalam variabel. Menjadikan variabel scalar, dengan dipisahkan koma.

#!usr/bin/perl @makanan = (ayam,telo,celeng); $a = shift(@makanan); @urut = sort(@makanan); $b = scalar(@makanan); $c = join(@makanan); print Banyaknya isi variabel makanan adalah $b buah\n; print $c;

Hashes Berisi pasangan variabel. Dimulai dengan tanda %.

#!usr/bin/perl %makanan = (antok => ayam, petani => telo, obelix => celeng); print Content-type:text/html\n\n; print <<EOF; <html> <head> <title>Contoh CGI</title> </head> <body> EOF foreach $i (keys %makanan) { print makanannya $i adalah $makanan{$i}<br>\n; } print $makanan{antok}\n; print<<Akhir; </body> </html> Akhir

Baris kedua merupakan deklarasi variabel hashes. Antok pasangannya adalah ayam, petani dengan telo dan obelix dengan celeng. Baris ketiga menunjukkan bahwa keluarannya adalah berupa file html (akan ditampilkan di web). Baris keempat memerintahkan Perl untuk menampilkan baris-baris selanjutnya apa adanya sampai ketemu kata EOF (bisa diganti-ganti). Pada fungsi foreach kita memakai fungsi keys, yang akan menghasilkan nilai-nilai pertama, yaitu antok, petani dan obelix. Program ini bisa dijalankan melalui web browser, cukup dengan meletakkannya filenya di direktori cgi-bin dan mengganti permissionnya (ketikkan chmod a+x namafile). Ada beberapa fungsi untuk memanipulasi variabel hashes selain fungsi keys :

delete $makanan{petani} exists $makanan{antok} values %makanan scalar %makanan

mengeluarkan nilai petani dan pasangannya. true jika antok ada. menghasilkan nilai pasangannya : ayam, telo dan celeng. true jika %makanan ada isinya, tidak kosong.

Variabel environment merupakan variabel hashes yang dikirim web browser setiap menjalankan CGI. Nama variabelnya adalah %env.

Keys
DOCUMENT_ROOT HTTP_COOKIE HTTP_HOST HTTP_REFERER HTTP_USER_AGENT HTTPS PATH QUERY_STRING REMOTE_ADDR REMOTE_HOST REMOTE_PORT REMOTE_USER REQUEST_METHOD REQUEST_URI SCRIPT_FILENAME SCRIPT_NAME SERVER_ADMIN SERVER_NAME SERVER_PORT SERVER_SOFTWARE

Value The root directory of your server The visitor's cookie, if one is set The hostname of your server The URL of the page that called your script The browser type of the visitor "on" if the script is being called through a secure server The system path your server is running under The query string The IP address of the visitor The hostname of the visitor The port the visitor is connected to on the web server The visitor's username (for .htaccess-protected pages) GET or POST The interpreted pathname of the requested CGI (relative to the document root) The full pathname of the current CGI The interpreted pathname of the current CGI (relative to the document root) The email address for your server's webmaster Your server's fully qualified domain name (e.g. www.cgi101.com) The port number your server is listening on The server software you're using (such as Apache 1.3)

#!usr/bin/perl print Content-type=text/html\n\n; print <<EOF; <html> <head> <title>Menampilkan semua variabel environment</title> </head> <body> EOF foreach $a (sort (keys %env)) { print $a = %env{$a}<br>\n; } print </body>\n; print </html>\n;

Save sebagai env.cgi, dan jalankan pada browser anda. Pada fungsi foreach di atas terdapat fungsi baru, yaitu sort. Gunanya adalah untuk mengurutkan abjad (jadi tidak bisa mengurutkan angka).

Membuat Form sederhana


Ada dua cara mengirim form dari HTML : post dan get. Post akan mengirim data dalam bentuk input pada program CGI, sedangkan get akan dikirim sebagai variabel, yaitu dalam variabel environment (QUERY_STRING). Post dipakai apabila data yang dikirim banyak atau rahasia. Get dipakai apabila data yang dikirim sedikit dan tidak rahasia. Get bisa dituliskan langsung di URL.

! METODE GET

<html> <body> <form method=get action=cgi-bin/env.cgi> nama : <input type=text name=nama><br> alamat : <input type=text name=alamat><br> <input type=submit name=kirim value=kirim> <input type=reset value=reset> </form> </body> </html>

Save sebagai file test.html, kemudian jalankan di web browser. Isi dengan nama lengkap dan alamat anda. Kemudian klik kirim. Perhatikan isi dari QUERY_STRING. Nilainya berbentuk seperti ini :
nama=Prasaja+Wikanta&alamat=Wisma+Unibraw+29+Malang

Spasi akan dipisahkan dengan tanda +. Jika kita ingin menampilkannya, maka variabel tersebut harus dipisahkan.
#!usr/bin/perl print Content-type=text/html\n\n; print <<EOF; <html> <head> <title>Parsing isi variabel QUERY_STRING</title> </head> <body> EOF @nilai = split(/&/,$env{'QUERY_STRING'}); foreach $i (@nilai) { ($varname, $mydata) = split(/=/,$i); print "$varname = $mydata<br>\n"; } print </body></html>\n;

Save sebagai file input.cgi, ganti atribut action pada file test.html menjadi input.cgi. Jalankan test.html pada web browser. Fungsi split adalah untuk memecah isi variabel berdasarkan karakter tertentu. Untuk variabel nilai isinya adalah nama=Prasaja+Wikanta dan alamat=Wisma+Unibraw+29+Malang. Silahkan coba sendiri untuk memisahkan tanda +. "

#!/usr/bin/perl print "Content-type:text/html\n\n; print "<html><head><title>Selamat Datang</title></head>\n"; print "<body>\n"; if ($ENV{'HTTP_USER_AGENT'} =~ /MSIE/) { print "Anda memakai IE\n"; } elsif ($ENV{'HTTP_USER_AGENT'} =~ /Mozilla/) { print "Anda memakai Netscape\n"; } else { print "Anda memakai selain IE/Netscape\n"; } print "</body></html>\n";

Tanda =~ akan mencari string dalam $ENV{HTTP_USER_AGENT} yang sama dengan /MSIE/. Tanda =~ juga dapat dipakai untuk mengganti sebuah karakter atau kata.
$telo $telo $telo print = ayam GoReNg sangat EnAk rasanya\n; =~ s/sangat/tidak/; =~ tr/[A-Z]/[a-z]/; $telo;

Baris kedua akan mengganti kata sangat dengan kata tidak. Baris ketiga mengganti karakter antara A sampai Z dengan karakter a sampe z.

! METODE POST
#!/usr/bin/perl print "Content-type:text/html\n\n"; read(STDIN, $data, $ENV{'CONTENT_LENGTH'}); @pasangan = split(/&/, $data); foreach $a (@pasangan) { ($nama, $nilai) = split(/=/, $a); $nilai =~ tr/+/ /; $nilai =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; $FORM{$nama} = $nilai; } print "<html><head><title>Isi form</title></head><body>"; foreach $a (keys(%FORM)) { print "$a = $FORM{$a}<br>"; } print "</body></html>";

Save sebagai form.cgi, kemudian ganti method pada file test.html dengan post, dan action dengan form.cgi. Kita cukup copy-paste 10 baris di atas, kemudian untuk mengakses input-input dari CGI cukup memanggil variabel $FORM{nama_input}. Sekarang kita coba buat form untuk mengirim email.

#!/usr/bin/perl print "Content-type:text/html\n\n"; read(STDIN, $data, $ENV{'CONTENT_LENGTH'}); @pasangan = split(/&/, $data); foreach $a (@pasangan) { ($nama, $nilai) = split(/=/, $a); $nilai =~ tr/+/ /; $nilai =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; $FORM{$nama} = $nilai; } $program = usr/sbin/sendmail; open (SURAT, |$program t); $penerima = antok@hotmail.com, antok@ikabhasu.ee.itb.ac.id; print MAIL To: $penerima\n; print MAIL From: celeng@kurusetra.com celeng\n; print MAIL Reply-to: ayam@kurusetra.com\n; print MAIL Subject: Test test\n\n; foreach $a (keys(%FORM)) { print "$a = $FORM{$a}\n"; } close(MAIL); print<<EOF; <html><head><title>Terimakasih</title></head> <body> Terimakasih telah bersedia mengisi </body> </html> EOF

Tabel perbandingan :
Test $x is equal to $y $x is not equal to $y $x is greater than $y $x is greater than or equal to $y $x is less than $y $x is less than or equal to $y Numbers $x == $y $x != $y $x > $y $x >= $y $x < $y $x <= $y Strings $x eq $y $x ne $y $x gt $y $x ge $y $x lt $y $x le $y

Sub Program
#!usr/bin/perl &celeng(3,4); sub celeng { local ($param1,$param2) = @_; $a = $param1+$param2; print $param1 ditambah $param2 adalah $a\n; }

Baris kedua adalah perintah untuk menjalankan sub program, biasanya dimulai dengan tanda &. Namun tidak memakai tanda juga boleh. Tiap sub program dimulai dengan kata sub. Terdapat variabel spesial untuk sub program, yaitu @_. Variabel ini berisi stream input dari sub program.

Membuat Form yang lebih lengkap


Kali ini kita akan mencoba membuat form yang memakai checkbox, listbox dan radiobutton.
<html> <head> <title>Survei</title> <body> <form action="./cgi-bin/test.cgi" method="POST"> Makanan yang disukai :<br> <input type="checkbox" name="celeng" value="ya">Celeng Panggang<br> <input type="checkbox" name="telo" value="ya">Telo Goreng<br> <input type="checkbox" name="ayam" value="ya">Ayam Bakar<br> Makanan paling favorit :<br> <input type="radio" name="makananFavorit" value="celeng">Celeng Panggang<br> <input type="radio" name="makananFavorit" value="telo">Telo Goreng<br> <input type="radio" name="makananFavorit" value="ayam">Ayam Bakar<br> Makanan paling favorit kedua (boleh sama dengan di atas) : <br> <select name="makananFavoritKedua"> <option value="celeng">Celeng Panggang</option> <option value="telo">Telo Goreng</option> <option value="ayam">Ayam Bakar</option> </select><br> <input type="submit" name="kirim" value="kirim"> <input type="reset" value="reset"> </form> </body> </html>

Kemudian file cgi-nya :

#!/usr/bin/perl print "Content-type:text/html\n\n"; read(STDIN, $data, $ENV{'CONTENT_LENGTH'}); @pasangan = split(/&/, $data); foreach $a (@pasangan) { ($nama, $nilai) = split(/=/, $a); $nilai =~ tr/+/ /; $nilai =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; $FORM{$nama} = $nilai; } print "<html><head><title>Hasil</title></head>\n"; print "<body>\n"; %makanan = ( "celeng" => "Celeng Panggang", "telo" => "Telo Goreng", "ayam" => "Ayam Bakar"); @makanan = ("celeng","telo","ayam"); foreach $a (@makanan) { if ($FORM{$a} eq "ya") { print "Anda suka $makanan{$a}.<br>\n"; } } $favorit1 = $FORM{'makananFavorit'}; $favorit2 = $FORM{'makananFavoritKedua'}; print "Namun yang terfavorit adalah $makanan{$favorit1}.<br>\n"; print "Dan yang kedua favorit adalah $makanan{$favorit2}.<br>\n"; print "</body></html>\n";

Tidak ada fungsi yang baru, semuanya sudah jelas di listing program.

Menulis ke file
Ada tiga mode untuk operasi file, yaitu reading, writing dan append.
open(FILE,telo.txt) open(FILE,>telo.txt) open(FILE,>>telo.txt)

#reading #writing, kalau sudah ada akan di-overwrite #append, kalau belum ada buat baru

<html> <head> <title>Buku Tamu</title> </head> <body> <form method=post action=tulis.cgi> nama : <input type=text name=nama><br> email : <input type=text name=email><br> pesan :<br> <textarea rows=10 cols=50 name=pesan wrap="virtual"> </textarea><br> <input type=submit name=kirim value=kirim> <input type=reset name=reset value=reset> </body> </html>

Kemudian file cgi-nya :

#!/usr/bin/perl print "Content-type:text/html\n\n"; read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'}); @pairs = split(/&/, $buffer); foreach $i (@pairs) { ($varname,$mydata) = split(/=/, $i); $mydata =~ tr/+/ /; $mydata =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; $form{$varname} = $mydata; } $nama_file = "telo.txt"; $data = "$form{nama} $form{email} $form{pesan} *---------*\n"; open(OUTFILE,">>$nama_file"); flock(OUTFILE,2); seek(OUTFILE,0,2); print OUTFILE "$data"; close(OUTFILE); print <html><head><title>Buku tamu</title><head>\n; print <body>terima kasih telah mengisi buku tamu</body></html>\n;

Fungsi flock untuk mencegah file text ditulisi oleh 2 atau lebih program CGI secara bersamaan. Fungsi seek untuk memastikan bahwa kita menulis mulai dari akhir. (0 = awal file, 1 = posisi saat ini, 2 = akhir file). Untuk membaca file, programnya sbb :

#!/usr/bin/perl print "Content-type:text/html\n\n"; open (FILE,"telo.txt"); @baris = <FILE>; close(FILE); $jumlah_baris = scalar(@baris) - 1; $baris_awal=0; $data = ""; $counter = 0; for ($i=0; $i<=$jumlah_baris; $i++) { @kata = split(/ /, $baris[$i]); chop($kata[0]); if ($kata[0] eq '*---------*') { $nomorRecord += 1; $pesan = ""; for ($j=$baris_awal+2; $j<=$i-1; $j++) { $pesan .= "$baris[$j]<br>"; } $data[$nomorRecord] = " <b>dari :</b> $baris[$baris_awal]<br> <b>email : </b>$baris[$baris_awal+1]<br> <b>pesan : </b><br> $pesan<br>"; $baris_awal = $i+1; } } print <html><head><title>Buku Tamu</title></head><body>\n; foreach $a (@data) { print $a\n; } print </body></html>\n;

Kita akan menyimpan tiap pesan dalam @data, sehingga kita bisa bebas untuk menampilkan urutan isi buku tamu, entah dari lama ke baru atau dari baru ke lama. Tanda .= adalah untuk menggabungkan string.

Anda mungkin juga menyukai