Operator

Operator aritmetika, repetisi string dengan x, serta perbedaan perbandingan angka (==) dan perbandingan string (eq).

Daftar isi

Operator membentuk ekspresi dari satu atau beberapa nilai, dan seluruh contoh di topik ini dijalankan sebagai skrip utuh sehingga keluarannya dapat dibandingkan baris demi baris. Pembahasan mencakup operator aritmetika, repetisi string dengan operator x, serta dua kelompok operator perbandingan, yaitu perbandingan angka dan perbandingan string. Jebakan yang paling sering terjadi ketika kedua kelompok tertukar juga diperagakan dengan keluaran aslinya.

Operator aritmetika#

Perl menyediakan enam operator aritmetika dasar, yaitu penjumlahan +, pengurangan -, perkalian *, pembagian /, sisa pembagian %, dan perpangkatan **. Pembagian menghasilkan pecahan tanpa membulatkan ke bilangan bulat terdekat. Operator % menghitung sisa pembagian, sedangkan ** menghitung pangkat. Tanda minus juga berfungsi sebagai operator unary, yaitu operator yang bekerja pada satu operan saja, sehingga -$suhu menghasilkan nilai terbalik dari $suhu. Urutan penghitungan mengikuti tingkat keutamaan yang dikenal dari matematika, yaitu pangkat lebih dahulu, kemudian perkalian, pembagian, dan sisa pembagian, lalu penjumlahan dan pengurangan.

Skrip berikut mencetak hasil keenam operator sekaligus:

perl aritmetika.pl
#!/usr/bin/env perl
use strict;
use warnings;

print "7 + 3  = ", 7 + 3, "\n";
print "7 - 3  = ", 7 - 3, "\n";
print "7 * 3  = ", 7 * 3, "\n";
print "7 / 3  = ", 7 / 3, "\n";
print "7 % 3  = ", 7 % 3, "\n";
print "2 ** 10 = ", 2 ** 10, "\n";
text Keluaran
7 + 3  = 10
7 - 3  = 4
7 * 3  = 21
7 / 3  = 2.33333333333333
7 % 3  = 1
2 ** 10 = 1024

Hasil 7 / 3 dicetak sebagai 2.33333333333333, yaitu pecahan yang tidak dibulatkan, sehingga pembagian dua bilangan bulat tidak pernah kehilangan bagian desimalnya. Baris 7 % 3 menghasilkan 1 karena 7 berisi dua kali 3 dan tersisa 1. Baris terakhir menunjukkan ** menghitung 2 pangkat 10 menjadi 1024, dan tingkat keutamaannya lebih tinggi daripada perkalian sehingga ekspresi 2 ** 10 * 3 dibaca sebagai (2 ** 10) * 3. Perl menyimpan angka sebagai bilangan pecahan presisi ganda, sehingga deretan digit pada keluaran tersebut adalah hampiran seakurat penyimpanan itu mampu, bukan pecahan berulang yang ditulis penuh.

Perilaku % perlu dicermati ketika operannya bukan bilangan bulat. Kedua operan dipotong menjadi bilangan bulat terlebih dahulu, sehingga 7.9 % 3 menghasilkan 1, dan tanda hasilnya mengikuti tanda operan kanannya, sehingga -7 % 3 menghasilkan 2. Pembagian dengan nol tidak ditoleransi sama sekali, karena program langsung berhenti dengan pesan error Illegal division by zero.

Repetisi string dengan x#

Operator x mengulang operan kirinya sejumlah yang dinyatakan operan kanannya, dan hasilnya selalu berupa string. Apabila operan kiri berupa angka, angka itu dikonversi menjadi teks terlebih dahulu, sebagaimana konversi otomatis yang bekerja pada operator penyambungan titik. Operan kanan juga dipotong menjadi bilangan bulat sebelum digunakan, sehingga "ha" x 2.7 berperilaku sama dengan "ha" x 2.

Skrip berikut menggunakan x untuk tiga keperluan berbeda:

perl repetisi.pl
#!/usr/bin/env perl
use strict;
use warnings;

my $garis = "-" x 24;
print "$garis\n";
print "LAPORAN PENJUALAN\n";
print "$garis\n";

my $tepuk = "ha" x 3;
print "$tepuk\n";

# operan kiri berupa angka, dikonversi menjadi string lebih dahulu
my $deret = 7 x 3;
print "$deret\n";
text Keluaran
------------------------
LAPORAN PENJUALAN
------------------------
hahaha
777

Baris pertama membangun garis pemisah sepanjang 24 karakter tanpa menghitung panjangnya secara manual, dan garis yang sama digunakan untuk menutup judul laporan. Ekspresi "ha" x 3 menghasilkan hahaha. Ekspresi 7 x 3 menghasilkan 777 karena angka 7 diubah menjadi teks "7" lebih dahulu, kemudian teks itu diulang tiga kali.

Operator x menjadi berguna ketika panjang teks bergantung pada data, misalnya garis pemisah yang panjangnya mengikuti lebar kolom. Penulisan ulang tanda hubung secara manual tidak dapat menyesuaikan diri, sedangkan satu ekspresi x cukup diubah angka pengulangnya. Cara yang sama digunakan untuk spasi pengisi kolom, misalnya " " x $lebar.

Urutan pengelompokan juga perlu dicermati, karena x mengikat lebih kuat daripada titik penyambung, sehingga "ab" x 2 . "c" dibaca sebagai ("ab" x 2) . "c" dan menghasilkan ababc. Pengulang bernilai nol menghasilkan string kosong tanpa peringatan apa pun. Pengulang bernilai negatif memunculkan peringatan Negative repeat count does nothing dan tetap menghasilkan string kosong, sehingga nilai pengulang yang berasal dari hitungan perlu diperiksa apabila hasil kosong tidak diharapkan.

Perbandingan angka dan string#

Perbandingan memiliki dua kelompok operator yang tidak dapat saling menggantikan. Kelompok angka membandingkan nilai secara numerik, sedangkan kelompok string membandingkan teks berdasarkan urutan byte karakternya. Kedua kelompok sama-sama menghasilkan nilai benar atau salah, yaitu nilai yang siap digunakan sebagai syarat percabangan.

Makna perbandinganOperator angkaOperator string
sama dengan==eq
tidak sama dengan!=ne
kurang dari<lt
kurang dari atau sama dengan<=le
lebih dari>gt
lebih dari atau sama dengan>=ge

Perl memilih cara membaca operan berdasarkan operatornya, bukan berdasarkan bentuk operannya. Skrip berikut membandingkan dua nilai yang sama menggunakan kedua kelompok operator:

perl perbandingan.pl
#!/usr/bin/env perl
use strict;
use warnings;

my $angka_a = 10;
my $angka_b = 9;

print "10 == 9 : ", ($angka_a == $angka_b ? "benar" : "salah"), "\n";
print "10 != 9 : ", ($angka_a != $angka_b ? "benar" : "salah"), "\n";
print "10 >  9 : ", ($angka_a > $angka_b ? "benar" : "salah"), "\n";
print "10 eq 9 : ", ($angka_a eq $angka_b ? "benar" : "salah"), "\n";
print "10 gt 9 : ", ($angka_a gt $angka_b ? "benar" : "salah"), "\n";
text Keluaran
10 == 9 : salah
10 != 9 : benar
10 >  9 : benar
10 eq 9 : salah
10 gt 9 : salah

Secara angka, 10 lebih besar daripada 9, sehingga 10 > 9 bernilai benar. Secara string, teks "10" dan "9" dibandingkan karakter demi karakter, dan karakter 1 terurut lebih dulu daripada 9, sehingga "10" lt "9". Itulah sebabnya 10 gt 9 bernilai salah, dan perbedaan inilah yang membuat kedua kelompok operator wajib dipisahkan. Kesetaraan numerik mengabaikan penulisan, sehingga "1.0" == "1" bernilai benar, sedangkan "1.0" eq "1" bernilai salah karena teksnya tidak identik. Perl juga menyediakan cmp dan <=>, yang menghasilkan -1, 0, atau 1 menurut urutan kedua operannya, sehingga selain sama atau tidaknya, urutan kedua nilai juga diketahui.

Jebakan == pada string#

Operator == mengonversi kedua operannya menjadi angka sebelum membandingkan. String yang tidak berawalan angka dikonversi menjadi 0, sehingga dua string yang berbeda dapat menyatakan hasil yang sama. Perintah berikut membandingkan dua teks yang sama sekali berbeda dengan ==:

bash
# dua string berbeda dibandingkan dengan operator angka ==
perl -e 'use strict; use warnings; my $sama = ("apel" == "jeruk") ? "sama" : "berbeda"; print "apel dan jeruk dianggap $sama\n"' 2>&1
text Keluaran
Argument "jeruk" isn't numeric in numeric eq (==) at -e line 1.
Argument "apel" isn't numeric in numeric eq (==) at -e line 1.
apel dan jeruk dianggap sama

Kedua string dikonversi menjadi 0, dan 0 == 0 bernilai benar. Peringatan muncul dua kali, tetapi program tetap berjalan dan keputusannya keliru tanpa berhenti. Perbandingan yang sama dengan operator string memberikan keputusan yang benar:

bash
# perbandingan yang sama memakai operator string eq
perl -e 'use strict; use warnings; my $sama = ("apel" eq "jeruk") ? "sama" : "berbeda"; print "apel dan jeruk dianggap $sama\n"' 2>&1
text Keluaran
apel dan jeruk dianggap berbeda

Aturannya pendek, yaitu gunakan eq, ne, lt, dan gt setiap kali operannya berupa teks, dan gunakan == ketika operannya memang angka. Pemisahan ini berlaku pula pada percabangan yang membaca keputusan dari string, karena satu operator yang tertukar tidak menimbulkan error apa pun. Konversi hanya berjalan tanpa peringatan ketika kedua string utuh sebagai angka, misalnya "2" dan "2.0" yang dianggap sama oleh == meskipun teksnya berbeda.

Kesalahan umum#

  1. Pembagian bulat diharapkan dari operator /, padahal Perl selalu menghasilkan pecahan, sehingga 7 / 2 bernilai 3.5 dan bukan 3. Gunakan fungsi int untuk mengambil bagian bulatnya, misalnya int(7 / 2), apabila nilai pecahan tidak dikehendaki.
  2. Operator % digunakan pada angka pecahan dengan harapan sisa desimalnya ikut dihitung. Perl memotong kedua operannya menjadi bilangan bulat terlebih dahulu, sehingga 7.9 % 3 menghasilkan 1. Pastikan kedua operan memang bilangan bulat sebelum operator ini digunakan.
  3. Tanda x tertulis alih-alih * pada perhitungan. Ekspresi 7 x 3 menghasilkan string 777 dan bukan angka 21, dan kekeliruan ini tidak selalu memunculkan pesan apa pun. Periksa kembali operator yang ditulis setiap kali hasil yang tercetak berbentuk pengulangan teks.

Ringkasan#

  • Operator aritmetika +, -, *, /, %, dan ** bekerja pada angka, dengan / yang selalu menghasilkan pecahan tanpa pembulatan.
  • Operator x mengulang operan kirinya dan selalu menghasilkan string, termasuk ketika operan kirinya berupa angka.
  • Perbandingan angka menggunakan ==, !=, <, <=, >, dan >=, sedangkan perbandingan string menggunakan eq, ne, lt, le, gt, dan ge.
  • == mengonversi kedua operannya menjadi angka, sehingga dua string berbeda dapat dianggap sama dan teks wajib dibandingkan dengan eq.

Referensi#