Modul adalah berkas berisi kumpulan subrutin dan variabel yang dikemas dalam satu wilayah penamaan tersendiri agar dapat digunakan ulang oleh banyak program. Topik ini membahas cara membuat modul berupa package, yaitu unit pengemasan kode Perl, memuatnya dengan use dan require, serta mengekspor subrutin melalui @EXPORT dan @EXPORT_OK dengan bantuan modul Exporter. Setelah membacanya, perbedaan pemuatan modul saat kompilasi dan saat program berjalan dapat dipahami beserta hasil keduanya.
Membuat modul dari sebuah package#
Sebuah modul Perl adalah berkas dengan ekstensi .pm yang diawali deklarasi package. Deklarasi tersebut membuka namespace (ruang nama), yaitu wilayah penamaan terpisah tempat subrutin dan variabel milik modul berada tanpa bertabrakan dengan kode program penggunanya. Nama package harus sama dengan nama berkasnya, sehingga package Salam wajib disimpan sebagai Salam.pm. Perl mencari modul berdasarkan nama berkas ini, sehingga ketidakcocokan nama langsung membuat modul tidak dapat dimuat.
Berkas berikut memuat modul Salam lengkap dengan dua subrutin dan persiapan mekanisme ekspornya. Simpan berkas sebagai Salam.pm di direktori kerja.
package Salam;
use strict;
use warnings;
use Exporter 'import';
# subrutin pada @EXPORT terimpor otomatis oleh program pengguna modul
our @EXPORT = ('sapa');
# subrutin pada @EXPORT_OK hanya terimpor apabila diminta secara eksplisit
our @EXPORT_OK = ('sapa_semua');
# mengembalikan sapaan untuk satu nama
sub sapa {
my ($nama) = @_;
return "Halo, $nama!";
}
# mengembalikan sapaan untuk beberapa nama sekaligus
sub sapa_semua {
my (@nama) = @_;
return "Halo, " . join(', ', @nama) . "!";
}
1;Tiga bagian pada modul di atas menjadi pola baku hampir semua modul. Pertama, use strict dan use warnings tetap berlaku di dalam package, sehingga kode modul diawasi seperti kode program biasa. Kedua, penutup 1; membuat berkas mengembalikan nilai true ketika dimuat, syarat yang diperiksa Perl pada setiap pemuatan modul. Ketiga, use Exporter 'import' menyiapkan subrutin import yang nantinya menyalin nama subrutin dari array @EXPORT dan @EXPORT_OK ke program pengguna. Subrutin sapa dan sapa_semua sendiri ditulis seperti subrutin biasa, lengkap dengan my untuk variabel argumennya.
Memuat modul dengan use#
Pernyataan use memuat modul saat kompilasi, yaitu sebelum program mulai dieksekusi. Pada saat yang sama, use memanggil subrutin import milik modul, sehingga subrutin yang terdaftar pada @EXPORT langsung tersedia sebagai nama pendek. Berkas berikut menggunakan modul Salam dari bagian sebelumnya dan disimpan di direktori yang sama dengan Salam.pm.
use strict;
use warnings;
use lib '.';
# modul dimuat saat kompilasi, tanpa daftar impor
use Salam;
# sapa terimpor otomatis dari @EXPORT
print sapa('Budi'), "\n";
# sapa_semua tidak terimpor, sehingga dipanggil dengan nama lengkapnya
print Salam::sapa_semua('Budi', 'Citra'), "\n";Halo, Budi!
Halo, Budi, Citra!Baris use lib '.' menambahkan direktori kerja saat ini ke @INC, yaitu daftar direktori yang ditelusuri Perl untuk menemukan berkas modul. Tanpa baris tersebut, Perl hanya menelusuri direktori pustaka standar dan pemuatan gagal dengan pesan error Can't locate Salam.pm in @INC. Pola ini menjadi konvensi umum untuk modul lokal yang disimpan di direktori yang sama dengan skripnya.
Keluaran di atas menunjukkan dua gaya pemanggilan. Subrutin sapa dipanggil sebagai nama pendek karena terdaftar pada @EXPORT, sedangkan sapa_semua harus dipanggil dengan nama lengkapnya, Salam::sapa_semua, karena tidak terdaftar pada daftar ekspor otomatis. Panggilan sapa_semua('Budi') sebagai nama pendek menghentikan program dengan error Undefined subroutine &main::sapa_semua called.
Daftar impor eksplisit dengan @EXPORT_OK#
Array @EXPORT_OK berisi subrutin yang hanya diekspor apabila pemanggil memintanya pada daftar impor. Daftar impor ditulis setelah nama modul, misalnya use Salam qw(sapa sapa_semua). Mekanisme ini lebih terarah daripada @EXPORT karena setiap berkas menyebutkan secara eksplisit subrutin mana yang digunakannya, sehingga asal-usul setiap nama pendek mudah ditelusuri.
use strict;
use warnings;
use lib '.';
# daftar impor eksplisit memuat subrutin dari @EXPORT_OK
use Salam qw(sapa sapa_semua);
print sapa('Budi'), "\n";
print sapa_semua('Budi', 'Citra', 'Dewi'), "\n";Halo, Budi!
Halo, Budi, Citra, Dewi!Kedua subrutin kini dapat dipanggil sebagai nama pendek karena keduanya diminta pada daftar impor. Array @EXPORT dan @EXPORT_OK saling melengkapi dengan pembagian peran yang lazim, yaitu @EXPORT diisi antarmuka inti yang nyaris selalu dibutuhkan, sedangkan @EXPORT_OK diisi fungsi tambahan yang digunakan sesuai kebutuhan. Modul yang dirancang hati-hati cenderung lebih memilih @EXPORT_OK karena tidak memenuhi ruang nama program pengguna dengan nama yang mungkin tidak pernah dipanggil.
Operator qw() pada daftar impor memisahkan isinya berdasarkan spasi, sehingga daftar qw(sapa sapa_semua) setara dengan penulisan 'sapa', 'sapa_semua' secara manual. Apabila nama yang diminta tidak terdaftar pada @EXPORT maupun @EXPORT_OK, Exporter menghentikan proses kompilasi dengan pesan error is not exported by the Salam module. Salah ketik pada daftar impor dengan demikian langsung ketahuan saat kompilasi, bukan ketika subrutinnya dipanggil. Daftar impor hanya mengatur nama pendek, sedangkan pemanggilan dengan nama lengkap seperti Salam::sapa_semua tetap sah tanpa impor apa pun.
Memuat modul dengan require#
Pernyataan require memuat berkas modul saat runtime, yaitu ketika baris require itu sendiri dieksekusi, bukan saat kompilasi. Berbeda dari use, require tidak memanggil import, sehingga tidak ada nama pendek yang tersalin dan seluruh subrutin dipanggil dengan nama package-nya. Sifat ini berguna untuk memuat modul yang berat secara kondisional, misalnya hanya ketika program benar-benar membutuhkannya.
use strict;
use warnings;
use lib '.';
# modul hanya dimuat ketika baris ini dieksekusi saat runtime
my $perlu_salam = 1;
if ($perlu_salam) {
require Salam;
}
print Salam::sapa('Budi'), "\n";
print Salam::sapa_semua('Budi', 'Citra'), "\n";Halo, Budi!
Halo, Budi, Citra!Setiap berkas modul yang berhasil dimuat dicatat Perl pada hash %INC selama program berjalan, sehingga eksekusi require kedua untuk modul yang sama tidak memuat ulang berkasnya. Apabila berkas modul tidak ditemukan di @INC, program berhenti dengan error Can't locate Salam.pm in @INC, dan kegagalan itu baru muncul ketika baris require dieksekusi. Bentuk require juga menerima variabel sebagai argumennya, dan nilai variabel tersebut diperlakukan sebagai nama berkas tanpa penerjemahan tanda :: menjadi pemisah direktori.
Bentuk require Salam menerjemahkan nama package menjadi nama berkas Salam.pm lalu menelusuri @INC, sedangkan bentuk require 'Salam.pm' menerima nama berkas secara langsung. Karena pemuatan terjadi ketika barisnya dieksekusi, pemanggilan subrutin modul sebelum require dieksekusi akan menghasilkan error, sedangkan use selalu selesai dimuat sebelum baris program pertama berjalan. Pilih use untuk kebutuhan lazim dan require untuk pemuatan yang sengaja ditunda.
Kesalahan umum#
Program yang memuat modul yang baru ditulis biasanya mengalami tiga kegagalan berikut. Mengenali pesannya mempercepat perbaikan.
- Berkas modul tidak mengembalikan nilai true. Pemuatan berhenti dengan pesan error
did not return a true value. Pastikan baris1;berada di akhir berkas modul. - Modul tidak ditemukan. Perl menampilkan pesan error
Can't locate Salam.pm in @INCketika direktori modul tidak terdaftar pada@INC. Tambahkanuse lib '.'di atasuse Salamagar direktori kerja ikut ditelusuri. - Subrutin dipanggil tanpa diimpor. Subrutin pada
@EXPORT_OKtidak otomatis tersedia sebagai nama pendek, sehingga panggilan langsungnya menghasilkan errorUndefined subroutine. Tambahkan subrutin tersebut pada daftar impor atau panggil dengan nama lengkapnya.
Ringkasan#
- Modul Perl adalah berkas
.pmyang diawali deklarasipackagedan wajib mengembalikan nilai true di akhir berkas. usememuat modul saat kompilasi dan memanggilimport, sedangkanrequirememuat saat barisnya dieksekusi tanpa memanggilimport.- Modul Exporter mengekspor subrutin melalui
@EXPORTyang terimpor otomatis dan@EXPORT_OKyang terimpor hanya bila diminta pada daftar impor. use lib '.'menambahkan direktori kerja ke@INCsehingga modul lokal dapat ditemukan.
Referensi#
- perlmod — Perldoc — Dokumentasi resmi Perl tentang package, modul, dan mekanisme ekspornya.
- perlsub — Perldoc — Dokumentasi subrutin Perl yang menjadi isi utama sebuah modul.
- perlfunc — Perldoc
— Daftar fungsi bawaan Perl, termasuk
usedanrequireyang memuat modul.