Arsip mwmag  [Up]© 2002 PT Masterweb Media

Tutorial Perl: Bagian Kedua

Contoh Kasus

Bermain dengan File di Perl

IPC Sederhana di Perl

Memeriksa Masalah Email User

Bagian Kedua

Tutorial Perl

Yohanes Nugroho

Bagian: 2

Tujuan: Setelah membaca tutorial ini, pembaca dapat memahami manipulasi array dan manipulasi file di Perl, serta melakukan IPC sederhana.

Abstrak: Belajar Perl dengan contoh kasus manajemen user di Linux.

Dalam buku klasik The C Programming Language, Kernighan dan Ritchie pernah mengatakan, “Satu-satunya cara belajar bahasa pemrograman yaitu dengan membuat program dalam bahasa tersebut.” Anda akan melihat bahwa pernyataan itu sangat benar ketika Anda belajar Perl.

Setelah Anda membaca tutorial pertama mengenai Perl, kemungkinan Anda sudah pusing melihat keanehan dan kerumitan sintaks Perl. Kebanyakan orang akan berpikir kok ada bahasa pemrograman dengan sintaks yang aneh seperti ini? Memangnya ini bakal terpakai di dunia nyata?

Mulai edisi ini, saya akan mengisi artikel pemrograman Perl menggantikan Saudara Hasanuddin Tamir. Saya akan melakukan pendekatan langsung praktik dengan aplikasi di dunia nyata. Salah satu pekerjaan saya yang banyak memakai Perl adalah sebagai administrator jaringan di Teknik Informatika ITB, sehingga contoh-contoh yang diberikan lebih mengarah kepada administrasi jaringan. Menurut saya ilmu ini akan lebih berguna dibanding dengan contoh-contoh yang mengarah ke pemrograman Web karena keberadaan Perl di Web saat ini mulai goyah oleh bahasa dan teknologi lain.

Contoh Kasus

Dalam edisi ini saya akan membahas bagaimana melakukan manajemen user di Linux. Saya akan menggunakan contoh kasus di jurusan—di ITB sendiri jurusan disebut Departemen—Teknik Informatika. Setiap tahun di Teknik Informatika akan ada mahasiswa baru yang perlu dibuatkan account di berbagai server departemen yang meliputi Linux, Windows, dan Netware. User baru ini jumlah mencapai puluhan, sekitar 80–90 mahasiswa baru S1 setiap tahunnya. Untuk menciptakan user secara manual tentunya makan waktu yang lama, oleh karena itu perlu dibuat sebuah program untuk menciptakan user. Agar pembahasannya lebih mudah, yang akan dibuat di sini hanyalah program untuk membuat account di sistem operasi Linux. Harap diingat bahwa Perl tersedia juga di Windows dan DOS/Netware.

Bermain dengan File di Perl

Setiap awal semester Tata Usaha akan memberikan file, yang biasanya dalam format Excel yang berisi NIM (Nomor Induk Mahasiswa) dan Nama Mahasiswa yang perlu dibuatkan account di server jurusan. Dari Gnumeric—atau software spreadsheet apapun yang cukup fiturnya seperti StarCalc, kspread, atau Ms Excel—file tersebut dapat diekspor ke format yang lebih mudah ditangani Perl yaitu CSV (comma separated value).

Format CSV adalah format database teks sederhana di mana setiap row data diletakkan dalam satu baris fisik file, sementara setiap field dipisahkan dengan tanda koma. Contoh file CSV misalnya seperti ini:

13500067,Estevina Indri
13597075,Junaidi
13500069,Weni Hartanti
13590004,Oon
13500030,Yunita Caroline M

Anda sudah bisa melihat bahwa langkah pertama untuk membuat program pencipta account adalah dengan membuka file daftar user (anggap saja namanya user.txt), membaca baris demi baris, lalu menambahkan user yang ada di setiap baris tersebut ke dalam sistem.

Untuk membuka file di Perl, Anda bisa memakai fungsi open. Seperti ini:

open(F, "user.txt");

atau kalau ingin membukanya untuk ditulisi:

open(F, ">laporan.txt");

dan untuk diappend (ditulisi tapi hanya di bagian akhirnya):

open(F, ">>log.txt");

Bagi Anda yang pernah memakai DOS atau Unix, tentunya Anda sudah mengenal > dan >> untuk melakukan redireksi output program ke file. Untuk saat ini kita akan berkonsentrasi ke membaca file dulu. Kode berikut ini akan membaca sebuah baris dari file:

$baris = <F>;

Operator untuk membaca file di Perl adalah <> (aneh ya?). Operator ini bisa juga bekerja pada konteks list, seperti ini:

@semua = <F>;

Sekarang variabel @semua akan berisi seluruh baris yang tersisa di file—atau semua baris di file, jika tadi Anda belum membaca filenya. Program akan memroses setiap baris, jadi kita akan menggunakan loop while semacam ini:

while ($baris = <F>) { print  $baris;}

Potongan program tersebut akan mencetak baris-baris di file yang ditunjuk oleh filehandle F. Ketika akhir dari file dicapai, <F> akan mengembalikan nilai undef, yang secara boolean false di Perl, sehingga loopnya akan berhenti.

Di Perl dikenal yang namanya variabel default yaitu $_. Jika nama variabel tidak diberikan untuk kasus-kasus tertentu maka $_ akan dianggap sebagai nama variabelnya. Larry Wall, pencipta Perl, menyukai variabel ini karena fungsinya mirip dengan dalam bahasa alami manusia, yang kadang menghemat penyebutan kata benda dengan kata ganti atau dengan tidak disebut sama sekali (“Budi membawa sepotong coklat. Budi memakannya. Budi habiskan.”) Variabel ini juga memberi andil dalam mempersingkat program Perl. Jadi baris kode sebelumnya bisa diganti menjadi seperti ini:

while (<F>) { print;}

yang artinya sama saja dengan:

while ($_ = <F>) { print $_;}

Sebenarnya tidak sama persis, karena perbedaan scope $_, tapi saya tidak akan mempermasalahkannya saat ini.

Setelah program kita membaca file dan mengambil baris demi baris, kita perlu memisahkan tiap baris data antara bagian NIM mahasiswa dengan namanya, kemudian membentuk nama login yang sesuai. Di Unix dan berbagai OS lain, nama user tidak boleh terdiri dari angka saja, sehingga NIM mahasiswa tidak bisa dijadikan nama login. Oleh karena itu perlu dibuat aturan sederhana untuk mengubah NIM menjadi login yang unik.

Saya akan sedikit menyimpang dari Perl dulu untuk menjelaskan mengenai skema user ID. Jika Anda harus menangani user dalam jumlah besar di perusahaan atau sekolah sebaiknya Anda membuat skema penamaan yang konsisten sehingga memudahkan administrasi. Hal ini tentunya bisa jadi lebih tidak disukai untuk layanan yang membayar—misalnya webhosting atau email—di mana user ingin memilih user ID sendiri.

NIM atau NIP atau nomor apapun yang menjadi identifikasi biasanya dibuat dengan skema tertentu, di ITB skema untuk NIM adalah W XX YY ZZZ, W adalah kode strata (1=S1, 2=S2), XX adalah kode jurusan, YY adalah 2 digit angkatan, dan ZZZ adalah nomor urut mahasiswa di angkatan tersebut. Contohnya 13500030 (135-00-030) adalah mahasiswa S1 Teknik Informatika (135) angkatan 2000 (00) dengan nomor urut 30. Login yang dipakai di Teknik Informatika memakai skema ifWYZZZ. Prefiks if dipakai agar login tidak diawali dengan angka. Di sini hanya dipakai satu digit tahun terakhir Y karena maksimum waktu belajar mahasiswa adalah 7 tahun, sehingga tidak perlu takut akan terjadi bentrok antar digit akhir tahun yang berjarak 10 tahun.

Di Perl penjelasan panjang itu bisa diekspresikan seperti ini:

# buat login dari NIM
$login =~ s/^(.)35.(.)(...)$/if$1$2$3/;

Saya tidak akan menjelaskan bagaimana regex di atas bekerja, karena Anda bisa membaca sendiri tutorial khusus regex di majalah ini juga. Jadi programnya sekarang seperti ini:

open(F, "user.txt");
open(L, ">laporan.txt");
while (<F>) {
chomp; # hilangkan 'enter' di akhir baris
($login, $nama) = split(/,/);
print L "Nim : $login ";
$login =~ s/^(.)35.(.)(...)$/if$1$2$3/;
print L "Login: $login Nama: $nama\n";
}
close(F);
close(L);

Karena saya belum mengajarkan pada Perl bagaimana menambahkan user, program hanya akan membaca entri di file user.txt, lalu membuat—atau menimpa jika sudah ada—file laporan.txt yang isinya baris-baris berisi NIM, login, dan nama user. Contoh baris di laporan.txt:

Nim : 13500030 Login: if10030 Nama: Yunita

Dengan begini setidaknya saya bisa memeriksa bahwa regex yang saya pakai sudah benar.

Untuk memisahkan bagian NIM dengan Nama digunakan fungsi split. Fungsi split sangat berguna untuk memecah string yang memiliki pembatas tertentu, dalam kasus ini pembatasnya adalah koma (,). Di manual daftar fungsi Perl (perlfunc), Anda bisa melihat bahwa fungsi split memiliki prototipe seperti ini:

split /PATTERN/,EXPR,LIMIT
split /PATTERN/,EXPR
split /PATTERN/

EXPR adalah string yang akan displit, dalam prototipe yang terakhir, string yang dipakai adalah isi dari variabel $_.

PATTERN adalah regex pembatas string. Jadi Anda tidak harus memakai karakter tunggal sebagai pembatas. Misalnya Anda punya file, yang pemisah fieldnya adalah karakter tab, lalu Anda menyuruh seseorang untuk mengedit filenya—kebetulan orang tersebut tidak menyadari bahwa pemisah seharusnya adalah tab—dan dia mengira field itu dipisah dengan spasi, maka dia memakai spasi alih-alih tab. Anda tetap bisa memisahkan dengan benar setiap field seperti ini:

@hasil = split(/ +|\t/);

Baris itu berarti pisahkan string di $_ dengan pemisah field satu atau lebih spasi, atau sebuah tab.

LIMIT dipakai untuk membatasi jumlah field yang menjadi hasil split. Misalnya lagi, Anda punya file seperti ini:

0811xxxxxx Yudis
0815xxxxxx Gregorius Ardhian
0856xxxxxx Nita

pemisah antara nama dengan nomor telepon adalah spasi, tapi pemisah antara nama depan dengan nama belakang juga spasi. Dalam contoh ini kita tahu, bahwa jumlah field di setiap row cuma ada 2, jadi kita tetap bisa memisah stringnya dengan benar seperti ini:

($nomor, $nama) = split(/ /, $datum, 2);

Satu hal yang belum saja jelaskan mengenai split, split bekerja di konteks list, atau gampangnya dapat dikatakan bahwa split menghasilkan list. Anda bisa menampung hasil split di sebuah variabel array, atau ke beberapa variabel dengan menggunakan notasi list ().

Ada satu pelajaran lagi yang bisa dipetik dari contoh di atas yaitu cara menulis file. Cara menulis ke file di Perl sangat mudah, cukup dengan:

print FILEHANDLE ekspresi

misalnya seperti ini:

print F "hallo";

Fungsi print akan mencetak string, defaultnya ke layar (atau lebih tepatnya STDOUT, keluaran standar) atau ke filehandle yang kita tentukan. Setelah selesai membaca atau menulis ke file, jangan lupa menutupnya kembali dengan close, seperti ini:

close(FILEHANDLE);

IPC Sederhana di Perl

Mungkin hal yang paling penting ketika belajar bahasa pemrograman adalah belajar bagaimana mengendalikan program lain. Jadi jika sudah ada program yang bisa melakukan seluruh atau sebagian hal yang Anda inginkan, Anda cukup menjalankan program itu, dan mengambil hasilnya—kalau program itu menghasilkan sesuatu. Pada banyak bahasa pemrograman, mengendalikan program lain biasanya sangat sulit, tapi di Perl hal ini sangat mudah dilakukan.

Sebelum melangkah lebih jauh, saya akan jelaskan lebih dulu apa itu IPC dan apa hubungannya dengan mengendalikan program. Di lingkungan multitasking, umumnya sebuah proses, yaitu sebuah instan program yang sedang berjalan, perlu berkomunikasi dengan proses lain di sistem yang sama. Di lingkungan jaringan sebuah proses juga mungkin perlu berkomunikasi dengan proses lain di komputer lain. Komunikasi antarproses ini disebut dengan IPC (Interprocess Communication). IPC di Perl dibangun berdasarkan konsep IPC Unix yang meliputi sinyal, FIFO, subproses, pipa, soket, dan semafur. Tidak semua sistem operasi mendukung seluruh bentuk IPC Perl. Misalnya, di Windows tidak ada FIFO dan sinyal. Beberapa bentuk IPC juga memerlukan pengetahuan yang cukup dalam mengenai sistem Unix, jadi yang akan dibahas di sini hanya dua bentuk IPC saja yang paling sederhana dan paling berguna yaitu pipa, dan salah satu bentuk IPC dengan subproses yaitu fungsi system.

Fungsi system()

Fungsi system merupakan fungsi yang sangat ampuh. Dengan fungsi system kita bisa memanggil program apa saja untuk dijalankan seolah-olah kita mengetikkannya dari shell, misalnya begini:

system("ls"); # di Unix
system("notepad.exe"); # di windows
system("mpg123 Kunang-kunang.mp3"); # memainkan mp3

Fungsi system baru akan kembali jika program yang dijalankan sudah selesai, jadi untuk contoh yang terakhir Anda harus menunggu sampai lagu kunang-kunang selesai sebelum program diteruskan. Di OS tertentu, seperti varian Unix yaitu Linux, BSD, BeOS, Anda bisa menambahkan tanda ampersand (&) agar program dijalankan di background seperti ini:

system("play The-Corrs-One-night.wav &");

Jika baris itu diletakkan di baris awal program Anda maka program Anda berjalan dengan diiringi lagu The Corrs, One Night.

Sudah cukup penjelasannya, kita kembali ke kasus semula. Yang dibutuhkan program kita adalah kemampuan untuk menambah user. Tentunya yang pertama terpikir oleh Anda adalah program useradd. Program itu memang merupakan cara termudah menambah user, kita tidak perlu peduli apakah sistem memakai shadow password, NIS, atau apapun. Di Linux untuk menambah user kita cukup melakukan ini:

# useradd yohanes -c "Yohanes Nugroho"
# passwd yohanes

Perintah pertama menciptakan user, sedangkan yang kedua memberikan password ke user yang baru saja dibuat. Setelah mengetahui itu, kita bisa dengan mudah memodifikasi program pertama tadi dengan menyisipkan baris ini di akhir loop while:

system("useradd $login -c '$nama'");

Tapi kita juga perlu mengeset password usernya agar aman. Kita bisa saja mengeset passwordnya dengan nilai default tertentu (misalnya sama dengan user ID), tapi jika memungkinkan, sebaiknya dibuat password yang acak. Tentu masalahnya dengan password yang random adalah, Anda perlu memberikan manual ke setiap user. Dalam kasus ini hal tersebut mungkin dilakukan karena setiap mahasiswa baru wajib ikut pelatihan Linux.

Untuk membuat password acak Anda bisa memakai program yang khusus menghasilkan password, misalnya program mkpasswd di package expect, atau kita buat saja dengan cara kita sendiri. Di Linux, kalau Anda mencoba perintah ini di prompt bash, Anda akan mendapatkan string yang acak setiap kali perintah ini dijalankan

dd if=/dev/urandom bs=1 count=6 2>/dev/null | mimencode

Cukup bagus, kan? Tapi sekarang, bagaimana caranya membaca keluaran perintah tersebut dengan mudah? Sekarang IPC dengan pipa dapat dipakai di sini. Kalau Anda “membuka” program seperti ini:

open(F, "ls|");

Anda bisa membaca F seolah-olah Anda membuka sebuah file. Hasil dari pembacaan Anda adalah keluaran dari perintah ls. Dari contoh tersebut kita bisa membuat password yang acak dengan cara seperti ini:

open(R, "dd if=/dev/urandom bs=1 count=9 2>/dev/null | mimencode |");
$password = chomp(<R>);
close(R);

Setelah kita punya password yang baru, kita perlu mengeset passwordnya. Caranya cukup mudah, kalau di prompt bash, Anda bisa melakukannya seperti ini:

echo "passwordbaru" | passwd --stdin riza

Opsi --stdin hanya ada pada program passwd versi baru, jadi jika program passwd Anda tidak mendukung opsi itu, upgradelah program Anda itu.

Untuk melakukan hal yang sama di Perl, kita kembali memakai IPC dengan pipa. Kita cukup membalik tanda | supaya ada di depan perintah jika kita ingin “menulis” ke perintah tersebut. Seperti ini:

open(P, "|passwd --stdin $login");
print P $password;
close P;

Sayangnya Anda tidak bisa memakai | untuk membaca dan menulis sekaligus.

open(S, "|sort|");

tidak akan berhasil. Untuk bisa membaca dan menulis sekaligus Anda perlu membaca manual perlipc. Dalam contoh kali ini kemampuan seperti itu tidak diperlukan, jadi saya tidak akan membahasnya.

Lengkap sudah pengetahuan yang diperlukan untuk menambah user. Sekarang kita bisa membuat program lengkap untuk menambah user. Algoritmanya seperti ini: untuk setiap baris di file user.txt: 1) baca NIM dan Nama; 2) ciptakan login dan password; 3) buat user dengan program useradd; 4) set password user; 5) tuliskan login dan password di file laporan.

Login dan password perlu ditulis di file supaya Nona sekretaris yang ada di Tata Usaha bisa mencetaknya, memotong kertasnya menjadi kecil-kecil lalu memberikan potongan kertas yang sesuai ke mahasiswa baru yang meminta password, sebelum pelatihan Linuxnya dimulai.

Sekarang program lengkapnya menjadi:

#!/usr/bin/perl

open(F, "user.txt");
open(L, ">laporan.txt");
while (<F>) {
chomp; # hilangkan 'enter' di akhir baris
($login, $nama) = split(/,/);

print L "Nim : $login ";
$login =~ s/^(.)35.(.)(...)$/if$1$2$3/;
print L "Login: $login Nama: $nama ";

#ciptakan usernya
system("useradd $login -c '$nama'");

#buat password barunya
open(R, "dd if=/dev/urandom bs=1 count=9 ".
"2>/dev/null | mimencode|");
$password = <R>;
chomp($password);
close(R);

print L "Password: $password\n";

#set password baru
open(P, "|passwd --stdin $login");
print P $password;
close P;

}
close(F);
close(L);

Meskipun saya bilang lengkap, sebenarnya program ini tidaklah benar-benar lengkap karena tidak melakukan penanganan kesalahan yang mungkin terjadi.

Hanya dengan mengetahui cara memanipulasi file ditambah dengan IPC Anda sudah bisa membuat banyak program yang berguna. Dengan template program di atas, Anda bisa membuat program lain yang serupa. Misalnya saya telah membuat program untuk men-subscribe-kan peserta mata kuliah ke dalam milis mata kuliah. Masukan yang diberikan adalah file berisi data peserta mata kuliah, dan program eksternal yang dijalankan adalah ezmlm-sub. Program akan membaca file, lalu untuk setiap user, cukup dijalankan ezmlm-sub seperti ini:

ezmlm-sub /var/qmail/alias/if223 login@students.if.itb.ac.id

Setelah puas bermain dengan file dan IPC, saya akan masuk ke contoh kasus kedua di mana saya akan menerangkan manipulasi array di Perl.

Memeriksa Masalah Email User

Urusan email bagi sebagian orang merupakan hal yang sangat penting. Hampir setiap minggu di Teknik Informatika selalu ada orang yang mengeluhkan bahwa dia tidak bisa mengirim dan/atau menerima email. Umumnya mereka membuat kesalahan yang sama, pertama adalah mengeset permission home directory menjadi dapat ditulisi oleh semua orang (jika home dir dapat ditulisi oleh semua orang, program MTA akan menolak menyampaikan email). Dan yang kedua adalah salah mengeset filter email (procmail).

Kesalahan kedua ini jarang terjadi dan harus diperiksa secara manual. Kesalahan pertama sangat sering terjadi dan cukup merepotkan admin, padahal hal ini bisa diperiksa dengan otomatis. Umumnya mahasiswa lupa mengembalikan permission home directory setelah menyalin tugas dari sesama rekannya. Heran, padahal ada fasilitas mail dan ftp lho.

Daripada harus melakukan langkah-langkah seperti ini:

# Lihat apakah memang dia melakukan kesalahan itu lagi.
# ls -ld ~namauser
drwxrwxrwx 28 namauser grupuser 4096 Oct 9 14:55+
/home/namauser

# Ah, mereka tak pernah mengerti. Jadi harus dibetulkan.
# chmod 711 ~namauser

# Kirimkan email standar, menanyakan apakah dia sudah baca dokumen
# penggunaan email di Teknik Informatika.
# mail namauser < pesan.txt

akan lebih baik jika dibuat sebuah program yang akan memeriksa seluruh user, dan membetulkannya permission home directory user yang salah. Pertama tentunya kita perlu mendapatkan daftar user, untuk mendapatkannya kita bisa memanfaatkan fungsi getpwent (get password file entry) di Perl. Fungsi ini akan mengiterasi setiap entri yang ada di /etc/passwd (database user dan password di Unix). Nilai kembalian fungsi ini adalah list seperti berikut ini:

($userid, $passwd, $uid, $gid, $quota, $comment, $name, $home, $shell)
= getpwent();

Andaikan kita hanya butuh userid dan nama user saja kita bisa melakukanya seperti ini:

@entry = getpwent();
$userid = $entry[0];
$name = $entry[6];

tapi kita juga bisa melakukannya dengan lebih mudah seperti ini:

($userid, $name) = (getpwent())[0,6];

Mungkin Anda bingung dengan notasi di atas. Selain array, Perl juga mengenal array slice, atau potongan array. Misalnya kita punya daftar seperti ini:

@jagoan = ("prue", "piper", "phoebe", "blossom", 
"buttercup", "bubble");

maka kita bisa mengambil sebagian isi arraynya seperti ini:

@charmed = @jagoan[0,1,2];
#isi @charmed adalah ("prue", "piper", "phoebe")

Tentunya indeksnya tidak perlu urut, Anda bisa melakukan seperti ini:

@jagoanku = @jagoan[1, 5]; # @jagoanku = ("piper", "bubble");

Untuk mendapatkan daftar semua user ID, nama, berikut home directorynya di Unix, Anda bisa melakukannya seperti ini:

while (($id, $name, $home) = (getpwent())[0, 6, 7]) {
print "Id:$id Nama:$name Home:$home\n";
}

Setelah mampu mendapatkan daftar user dan homenya, sekarang kita perlu mendapatkan mode atau permission dari setiap home directory. Di Unix, untuk mendapatkan informasi mengenai file, kita memakai fungsi stat. Kembalian fungsi ini adalah array seperti ini:

($dev, $ino, $mode, $nlink, $uid, $gid, $rdev, $size, 
$atime, $mtime, $ctime, $blksize, $blocks) = stat $filename;

Saya tidak akan menjelaskan semua yang dikembalikan. Yang kita perlukan cuma $mode, karena kita hanya perlu tahu apakah direktori tersebut dapat ditulisi orang lain.

Anda bisa melihat mengenai permission Unix di tutorial Linux yang ada di majalah ini, jadi saya tidak akan menjelaskannya di sini. Cuma satu yang perlu diketahui, permission yang benar dalam contoh ini adalah 0711, jadi kita cukup memeriksa apakah permission sama atau tidak dengan ini. Jika tidak, kita perlu mengubahnya dengan chmod, seperti ini:

chmod 0711, $home

Dengan pengetahuan tambahan itu, sekarang sudah cukup untuk membuat versi sederhana dari program kita:

while (($home) = (getpwent())[7]) {
($mode) = (stat($home))[2];
if ($mode != 0711) {
chmod 0711, $home;
}
}

Tapi orang yang bersalah perlu diberi peringatan. Kita perlu mengirim email ke setiap orang yang bermasalah. Kita juga perlu membuat daftar orang yang bermasalah dan mengirimkannya ke admin.

$mailer = 'sendmail';

@bermasalah = (); #daftar orang bermasalah
# catatan: program ini tidak fool proof, karena home
# directory belum tentu ada untuk setiap user

while (($id, $name, $home) = (getpwent())[0, 6, 7]) {
($mode) = (stat($home))[2];
$mode &= 0777;
if ($mode != 0711) {
#kirim email
open(F, "|$mailer $id\@students.if.itb.ac.id");
#isikan header email di sini
print F "To: blablabla....\n\n";
print F "Dear $name\n";
print F "Isikan pesan email di sini";
# atau baca saja dari file
close(F);

#tambahkan ke daftar
push @bermasalah, $id;
#perbaiki kesalahannya
chmod 0711, $home;
}
}

# kirimkan email ke admin, berisi daftar orang yang bermasalah
open(F, "|$mailer admin\@students.bla.bla.bla");
print F "Dear admin\n";
print F "Inilah korban hari ini\n";
print F @bermasalah;
close(F);

Semua yang ada di program di atas sudah dijelaskan, kecuali fungsi push. Fungsi push merupakan salah satu dari beberapa fungsi yang berurusan dengan array. Fungsi yang lainnya adalah pop, shift, unshift, dan splice.

push akan menambahkan sebuah elemen ke array, seperti ini:

@agatha = ("Misteri di styles");
push @agatha, "Pembunuhan atas diri Roger Ackroyd";
push @agatha, "Membunuh itu gampang";
push @agatha, "Tirai";

Sekarang @agatha akan berisi ("Misteri di styles", "Pembunuhan atas diri Roger Ackroyd", "Membunuh itu gampang", "Tirai").

pop merupakan kebalikan dari push. pop mengambil satu elemen dari list. Melanjutkan contoh sebelumnya:

$buku = pop @agatha;

$buku sekarang berisi "Tirai". Fungsi push dan pop bekerja memakai ujung kanan array. Kalau Anda ingin bekerja di ujung kiri array, Anda bisa memakai shift dan unshift (shift seperti pop, dan unshift seperti push). Meskipun tidak ada hubungannya dengan program kita sekarang, ada satu fungsi lagi yang berhubungan dengan array yaitu splice. Jika Anda ingin memotong array, Anda bisa memakai fungsi ini. Anda bisa membaca mengenai fungsi ini di manual perlfunc, atau kalau Anda cukup sabar, saya akan membahasnya di edisi yang lain ketika kita membutuhkan fungsi ini.

Sambil membuat program untuk melakukan administrasi sistem di Linux, Anda sudah belajar bagaimana memanipulasi file di Perl, bagaimana melakukan IPC sederhana, serta melakukan manipulasi array. Jadi ini adalah akhir dari tutorial Perl bagian kedua. Bulan depan saya akan datang untuk pencinta sistem operasi dari Microsoft dengan materi administrasi Windows 2000/XP dengan Perl.

Yohanes Nugroho mahasiswa tingkat akhir Teknik Informatika ITB dan administrator jaringan Teknik Informatika ITB, dapat dihubungi di yohanes@opensource.or.id.

mw

Arsip mwmag  [Up]www.master.web.id/mwmag