Pemrograman · Bahasa pemrograman
Tutorial Perl untuk pemula
Jawaban singkat
Perl adalah bahasa scripting dinamis yang dibuat oleh Larry Wall pada 1987, paling dikenal karena kemampuan pengolahan teks dan regular expression bawaannya yang kuat. Perl terpasang sejak awal di sebagian besar sistem Unix dan dipakai untuk administrasi sistem, pemrosesan log, dan bioinformatika. Halaman ini membahas cara menjalankan Perl, scalar, array dan hash, alur kontrol, subroutine, reference, regular expression, serta penanganan error dengan die dan eval.
Buka Penguji regexApa itu Perl dan untuk apa dipakai
Perl adalah bahasa tingkat tinggi bertipe dinamis yang dibuat oleh Larry Wall pada 1987. Perl dirancang untuk pengolahan teks dan pembuatan laporan, lalu dikenal sebagai bahasa perekat (glue language) dalam administrasi sistem Unix dan pengembangan web awal. Regular expression Perl begitu berpengaruh sehingga banyak bahasa lain mengadopsi sintaks regex yang "kompatibel dengan Perl".
Saat ini Perl dipakai untuk script administrasi sistem, pemrosesan log dan teks, bioinformatika, aplikasi web lama, dan filter satu baris di command line. Perl sudah terpasang di sebagian besar sistem Linux dan Unix. CPAN, Comprehensive Perl Archive Network, menyimpan koleksi modul yang sangat besar dan dapat dipakai ulang. Tutorial ini membahas Perl 5; bahasa yang dulu disebut Perl 6 kini menjadi bahasa terpisah bernama Raku.
Menjalankan Hello, world
Pastikan Perl terpasang dengan perl -v. Di Windows, Strawberry Perl adalah distribusi yang umum dipakai. Awali setiap script dengan use strict; dan use warnings;: keduanya menangkap salah ketik dan kode yang tidak aman.
#!/usr/bin/env perl
use strict;
use warnings;
print "Hello, world!\n";perl hello.pl
# Hello, world!
perl -e 'print "Hello from a one-liner\n"'Statement diakhiri dengan titik koma. Komentar diawali dengan #. String dengan tanda kutip ganda menginterpolasi variabel dan escape seperti \n; string dengan kutip tunggal bersifat literal.
Variabel: scalar, array, dan hash
Variabel Perl diawali sigil yang menunjukkan jenis nilainya. Deklarasikan setiap variabel dengan my, yang membuatnya lokal pada blok di sekitarnya.
use strict;
use warnings;
my $name = "Perl"; # scalar: one value
my $year = 1987;
my @langs = ("Perl", "C", "sh"); # array: ordered list
my %port = (http => 80, https => 443); # hash: key-value pairs
print "$name since $year\n"; # Perl since 1987
print "First: $langs[0]\n"; # First: Perl (element is a scalar, so $)
print "Count: ", scalar(@langs), "\n"; # Count: 3
print "HTTPS: $port{https}\n"; # HTTPS: 443
print "Sum: ", "10" + 5, "\n"; # Sum: 15 (strings convert to numbers)
print "Join: " . "a" . "b" x 3, "\n"; # Join: abbb| Sigil | Jenis | Contoh |
|---|---|---|
$ | scalar: angka, string, atau reference | my $n = 42; |
@ | array: daftar terurut berisi scalar | my @list = (1, 2); |
% | hash: pasangan key-value tanpa urutan | my %h = (a => 1); |
& | subroutine (jarang ditulis) | &name |
Alur kontrol
Perl punya if, elsif, else, unless, while, until, for, dan foreach. Sebuah statement pendek bisa diikuti kondisi, sehingga terbaca seperti kalimat bahasa Inggris. next melompat ke iterasi berikutnya dan last keluar dari perulangan.
use strict;
use warnings;
my $score = 72;
if ($score >= 90) {
print "A\n";
} elsif ($score >= 70) {
print "B\n"; # B
} else {
print "C\n";
}
print "passed\n" if $score >= 50; # statement modifier
print "not perfect\n" unless $score == 100;
for my $i (1 .. 3) {
print "i = $i\n";
}
my @names = ("ann", "bo");
foreach my $n (@names) {
next if $n eq "bo"; # skip to the next item
print ucfirst($n), "\n"; # Ann
}
my $k = 3;
while ($k > 0) { $k--; }Nilai false adalah 0, "0", string kosong "", list kosong, dan undef. Semua selain itu bernilai true.
Subroutine
Definisikan fungsi dengan sub. Argumen diterima dalam array khusus @_, dan baris pertama yang lazim menyalinnya ke variabel bernama. Subroutine dapat mengembalikan scalar atau list.
use strict;
use warnings;
sub add {
my ($x, $y) = @_; # arguments arrive in @_
return $x + $y;
}
sub greet {
my ($name, $greeting) = @_;
$greeting //= "Hello"; # default if undefined
return "$greeting, $name!";
}
sub stats {
my @nums = @_;
my $sum = 0;
$sum += $_ for @nums;
return ($sum, $sum / @nums); # return a list
}
print add(2, 3), "\n"; # 5
print greet("Ann"), "\n"; # Hello, Ann!
my ($total, $avg) = stats(4, 8, 6);
print "$total $avg\n"; # 18 6Perl modern juga mendukung signature, seperti sub add($x, $y) { ... }, yang diaktifkan dengan use v5.36; atau lebih baru, yang sekaligus mengaktifkan strict dan warnings.
Array, hash, dan reference
Array dan hash dilengkapi fungsi bawaan yang kuat seperti push, pop, shift, sort, map, grep, keys, dan exists. Data bersarang memakai reference: [ ... ] membuat reference array dan { ... } reference hash, dan -> mengikutinya.
use strict;
use warnings;
my @nums = (5, 3, 8, 1);
push @nums, 9; # add to the end
my $last = pop @nums; # remove from the end: 9
my @sorted = sort { $a <=> $b } @nums; # numeric sort
my @doubled = map { $_ * 2 } @sorted;
my @big = grep { $_ > 4 } @sorted;
print "@sorted | @doubled | @big\n"; # 1 3 5 8 | 2 6 10 16 | 5 8
my %age = (ann => 31, bo => 25);
$age{cy} = 40;
delete $age{bo};
for my $who (sort keys %age) {
print "$who is $age{$who}\n"; # ann is 31 / cy is 40
}
print "has ann\n" if exists $age{ann};
# references build nested data structures
my $user = { name => "Ann", langs => ["Perl", "SQL"] };
print "$user->{name} knows $user->{langs}[1]\n"; # Ann knows SQL
print scalar @{ $user->{langs} }, "\n"; # 2Di dalam blok sort, $a dan $b adalah dua item yang sedang dibandingkan. <=> membandingkan secara numerik dan cmp membandingkan sebagai string; sort @list biasa mengurutkan sebagai string, sehingga 10 muncul sebelum 9.
Regular expression
Regular expression terintegrasi dalam sintaks Perl, dan inilah fitur khasnya. =~ menerapkan pencocokan m/.../ atau substitusi s/.../.../. Grup yang tertangkap tersedia sebagai $1, $2, dan seterusnya, dan modifier seperti g (global) dan i (tidak peka huruf besar/kecil) ditulis setelah garis miring penutup.
use strict;
use warnings;
my $line = "2026-10-31 ERROR disk full on /dev/sda1";
if ($line =~ /^(\d{4})-(\d\d)-(\d\d)\s+(\w+)/) {
print "year=$1 level=$4\n"; # year=2026 level=ERROR
}
(my $masked = $line) =~ s/\d/#/g; # copy, then replace digits
print "$masked\n"; # ####-##-## ERROR disk full on /dev/sda#
my @words = split /\s+/, $line;
print scalar(@words), " words\n"; # 6 words
my %h = ("a=1, b=2, c=3" =~ /(\w)=(\d)/g); # pairs into a hash
print join(",", map { "$_$h{$_}" } sort keys %h), "\n"; # a1,b2,c3Gunakan qr/.../ untuk menyimpan pattern yang sudah dikompilasi dalam variabel, dan modifier x untuk menulis pattern panjang dalam beberapa baris beserta komentar.
Penanganan error
die memunculkan exception dan warn mencetak peringatan ke standard error. eval { ... } menangkap exception dan menaruh pesan error di $@. Pemanggilan sistem seperti open mengembalikan false saat gagal dan mengisi $! dengan error dari sistem operasi, jadi periksa dengan or die.
use strict;
use warnings;
sub divide {
my ($x, $y) = @_;
die "division by zero\n" if $y == 0;
return $x / $y;
}
my $result = eval { divide(1, 0) };
if ($@) {
print "Caught: $@"; # Caught: division by zero
}
open(my $fh, "<", "missing.txt")
or print "Cannot open: $!\n"; # Cannot open: No such file or directoryPesan die yang diakhiri \n dicetak apa adanya; tanpa newline, Perl menambahkan nama file dan nomor baris. Sejak Perl 5.34 juga ada fitur try/catch eksperimental, dan modul seperti Try::Tiny banyak dipakai.
Program lengkap kecil: penghitung level log
Script ini membaca log dari file yang disebut di command line atau dari standard input, menghitung baris per level, dan mencetak ringkasan yang terurut. Contoh ini memperlihatkan operator diamond <>, regular expression, hash, dan printf.
#!/usr/bin/env perl
# logstat.pl: count log levels in a file or standard input
use strict;
use warnings;
my %count;
my $lines = 0;
while (my $line = <>) { # reads files named on the command line, or STDIN
chomp $line;
$lines++;
next unless $line =~ /\b(INFO|WARN|ERROR)\b/;
$count{$1}++;
}
printf "%d lines read\n", $lines;
for my $level (sort { $count{$b} <=> $count{$a} || $a cmp $b } keys %count) {
printf "%-5s %3d\n", $level, $count{$level};
}perl logstat.pl app.log
# 120 lines read
# INFO 97
# WARN 18
# ERROR 5Langkah selanjutnya
- perlintro dan tutorial lain di perldoc.perl.org, juga tersedia offline lewat
perldoc perlintro. - Learning Perl dan Modern Perl, dua buku terkenal untuk pemula.
- MetaCPAN, antarmuka pencarian untuk modul CPAN.
- perlre dan perlretut untuk referensi regular expression lengkap.
FAQ
Apakah Perl masih dipakai?
Ya. Perl terpasang di sebagian besar sistem mirip Unix dan masih umum dipakai dalam administrasi sistem, pengolahan teks, bioinformatika, dan sistem bisnis yang berjalan lama, meski semakin sedikit proyek web baru yang dimulai dengan Perl.
Apa perbedaan Perl dan Raku?
Raku bermula sebagai Perl 6 tetapi menjadi bahasa terpisah dengan desain berbeda. Perl 5 terus dikembangkan secara independen, dan nama Perl merujuk padanya.
Mengapa variabel Perl diawali $, @, dan %?
Sigil menunjukkan jenis nilai yang Anda dapatkan: $ untuk satu scalar, @ untuk list, dan % untuk hash. Itulah sebabnya satu elemen dari @items ditulis $items[0].
Apa fungsi chomp di Perl?
chomp menghapus newline di akhir string, yang biasanya Anda perlukan setelah membaca satu baris dari file atau keyboard.
Apakah Perl bagus untuk regular expression?
Ya. Regular expression adalah bagian dari sintaks inti Perl, dan PCRE, library regex yang dipakai banyak tool dan bahasa lain, dinamai dari gaya regex Perl.