cv.cm

Pemrograman · Bahasa pemrograman

Tutorial Perl untuk pemula

8 menit baca

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 regex

Apa 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
SigilJenisContoh
$scalar: angka, string, atau referencemy $n = 42;
@array: daftar terurut berisi scalarmy @list = (1, 2);
%hash: pasangan key-value tanpa urutanmy %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 6

Perl 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";           # 2

Di 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,c3

Gunakan 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 directory

Pesan 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   5

Langkah 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.

Semua tutorial pemrograman