Topik ini membahas dua prinsip yang membentuk desain Perl, yaitu TMTOWTDI dan pragmatisme, kemudian membandingkan gaya penulisan lama dengan disiplin modern melalui skrip yang benar-benar dijalankan. Perbandingan itu menunjukkan akibat nyata dari setiap pilihan gaya, mulai dari keluaran yang salah secara diam-diam sampai error yang tertangkap sebelum program berjalan. Penjelasannya sekaligus menjadi alasan atas dua baris pernyataan yang selalu ada pada setiap skrip di jalur ini.
Prinsip TMTOWTDI#
TMTOWTDI, kependekan dari There’s More Than One Way To Do It, adalah prinsip bahwa satu pekerjaan boleh dinyatakan dengan lebih dari satu bentuk kode. Prinsip ini menganggap keberagaman bentuk sebagai ruang gerak bagi penulis program, bukan sebagai kerancuan yang harus dihapus. Satu pekerjaan dapat diekspresikan dengan fungsi bawaan, dengan operator, atau dengan gabungan keduanya, dan bahasa tidak memaksa satu bentuk sebagai satu-satunya yang benar.
Contoh berikut mengubah satu string menjadi huruf kapital dengan dua cara yang berbeda, dan keduanya mencapai hasil kapitalisasi yang sama.
use strict;
use warnings;
my $kota = "bandung";
print uc($kota), "\n";
print "\u$kota\n";BANDUNG
BandungCara pertama memanggil fungsi uc, sedangkan cara kedua memanfaatkan urutan escape (escape sequence) \u pada interpolasi string. Keduanya sah menurut bahasa, sehingga pilihan jatuh pada keterbacaan dan kebiasaan tim yang mengerjakan kode tersebut. Keleluasaan semacam ini membawa konsekuensi berupa tanggung jawab yang lebih besar bagi penulis program, karena mutu kode ditentukan oleh disiplin yang menyertainya. Disiplin yang menahan keleluasaan itu dibahas pada bagian akhir topik.
Pragmatisme sebagai fondasi desain#
Pragmatisme menjadikan selesainya pekerjaan nyata sebagai ukuran utama desain Perl. Bahasa ini menitikberatkan pekerjaan sehari-hari, misalnya membaca log, menyaring baris, dan menyusun laporan, sehingga bentuk sintaks untuk pekerjaan itu tersedia tanpa persiapan panjang. Sikap desain tersebut dapat dilihat pada tiga sifat yang konsisten di seluruh bahasa ini.
Sifat pertama adalah kelonggaran default yang dapat diketatkan. Perl tidak memaksa deklarasi variabel, tidak menuntut satu paradigma pemrograman, dan tidak membebani program kecil dengan persiapan formal. Kelonggaran ini mempercepat penulisan skrip sederhana, sedangkan perangkat pengetatan seperti strict dan warnings menyediakan disiplin bagi kode yang dipelihara dalam jangka panjang. Perbedaan gaya antara skrip lama dan proyek modern berasal dari kombinasi keduanya, bukan dari versi bahasa yang berbeda.
Sifat kedua adalah kelengkapan fungsi bawaan untuk teks. Fungsi seperti split, join, sort, uc, dan length bekerja tanpa pustaka tambahan, sehingga pekerjaan yang paling sering ditangani bahasa ini dapat dikerjakan sejak baris pertama. Sifat ketiga adalah konteks, yakni cara Perl menilai satu ekspresi menurut kebutuhan pemanggilnya, misalnya apakah hasilnya diminta sebagai satu nilai atau sebagai daftar nilai. Mekanisme ini mendasari banyak perilaku Perl, sehingga akan terus muncul pada bahasan-bahasan berikutnya.
Gaya lama dan disiplin modern#
Gaya lama merujuk pada skrip yang ditulis sebelum strict dan warnings menjadi kebiasaan umum. Variabel digunakan tanpa deklarasi, dan kekeliruan ejaan nama variabel lolos tanpa terdeteksi. Skrip berikut sengaja ditulis dengan gaya itu untuk menunjukkan akibatnya.
# gaya lama: variabel global tanpa deklarasi, tanpa use strict, tanpa use warnings
$nama = "Ali";
$jumlah = 3;
$tambahan = 1;
$total = $jumlah + $tambhan;
print "Nama : $nama\n";
print "Tambahan : $tambahan\n";
print "Total : $total\n";Nama : Ali
Tambahan : 1
Total : 3Perhatikan angka pada baris Total. Nilai yang benar adalah 4, yaitu $jumlah ditambah $tambahan, tetapi skrip menampilkan 3 karena nama variabel pada baris perhitungannya salah ditulis menjadi $tambhan. Perl menerima nama itu sebagai variabel lain yang belum bernilai, menganggap nilainya 0, lalu melanjutkan eksekusi tanpa satu pun pesan. Keluaran yang tampak wajar padahal isinya salah adalah kelemahan pokok gaya lama.
Peringatan yang tersembunyi itu dapat dimunculkan dari command line dengan opsi -w, yang mengaktifkan warnings dari luar skrip. Jalankan kembali berkas yang sama dengan perintah berikut.
# mengulang eksekusi dengan opsi -w agar peringatan ikut tampil
perl -w gaya-lama.pl 2>&1Name "main::tambhan" used only once: possible typo at gaya-lama.pl line 7.
Use of uninitialized value $tambhan in addition (+) at gaya-lama.pl line 7.
Nama : Ali
Tambahan : 1
Total : 3Dua baris pertama keluaran adalah pesan peringatan dari Perl, dan baris keduanya bahkan menyebut kata possible typo secara harfiah. Pesan peringatan ditulis ke stderr, sedangkan keluaran print menuju stdout, sehingga pada tangkapan yang menggabungkan keduanya, pesan peringatan muncul lebih dahulu. Opsi -w bergantung pada cara perintahnya diketik, sehingga disiplin itu mudah hilang ketika skrip dijalankan tanpa opsi.
Disiplin modern menyelesaikan masalah tersebut dengan menaruh pemeriksaan di dalam skrip itu sendiri. use strict mewajibkan setiap variabel dideklarasikan terlebih dahulu, sedangkan use warnings mengaktifkan peringatan tanpa bergantung pada opsi command line. Berkas berikut mengerjakan tugas yang sama dengan disiplin tersebut.
# disiplin modern: use strict dan use warnings menyertai skrip sejak baris awal
use strict;
use warnings;
my $nama = "Ali";
my $jumlah = 3;
my $tambahan = 1;
my $total = $jumlah + $tambahan;
print "Nama : $nama\n";
print "Tambahan : $tambahan\n";
print "Total : $total\n";Nama : Ali
Tambahan : 1
Total : 4Perbedaannya paling terlihat ketika kesalahan ejaan yang sama dicoba pada kode modern. Kode yang menyebut $tambhan di bawah use strict tidak sampai dieksekusi karena ditolak pada tahap kompilasi dengan pesan error yang jelas. Jalankan perintah satu baris berikut untuk melihat perilakunya.
# memanggil variabel yang tidak dideklarasikan di bawah use strict
perl -e 'use strict; my $jumlah = 3; my $tambahan = 1; my $total = $jumlah + $tambhan; print $total;' 2>&1Global symbol "$tambhan" requires explicit package name (did you forget to declare "my $tambhan"?) at -e line 1.
Execution of -e aborted due to compilation errors.Pesan error itu menandai variabel yang belum dideklarasikan, dan eksekusi dihentikan sebelum satu baris program pun berjalan. Keluaran yang salah sejak awal dicegah dengan harga dua baris pernyataan. Karena itu, setiap berkas kode pada jalur ini memuat use strict dan use warnings pada baris awalnya, kecuali ada alasan khusus yang selalu dinyatakan.
Ringkasan#
- Menurut TMTOWTDI, satu pekerjaan sah dinyatakan dengan beberapa bentuk kode, dan pilihannya diserahkan pada keterbacaan.
- Pragmatisme menjadikan penyelesaian pekerjaan nyata sebagai ukuran desain, dengan fungsi bawaan untuk teks dan konteks sebagai ciri khasnya.
- Gaya lama tanpa
strictdanwarningsmembiarkan kesalahan ejaan variabel menghasilkan keluaran yang salah secara diam-diam. use strictmenangkap variabel tak dideklarasikan saat kompilasi, sedangkanuse warningsmengaktifkan peringatan dari dalam skrip tanpa opsi-w.
Referensi#
- perlrun — perldoc.perl.org — Rujukan opsi command line perl, termasuk -w untuk mengaktifkan warnings dan -e untuk kode satu baris.
- perlfunc — perldoc.perl.org — Daftar fungsi bawaan Perl, termasuk uc yang digunakan pada contoh TMTOWTDI.
- perlop — perldoc.perl.org — Dokumentasi operator dan urutan escape seperti \u pada interpolasi string.