Konversi otomatis dari string ke angka di Perl

is_number looks_like_number Scalar::Util casting type conversion

Bayangkan Anda sedang menyiapkan daftar belanja, tertulis di dalamnya

"2 potong roti"

dan memberikannya pada pasangan Anda yang langsung melemparkan kesalahan penulisan itu ke wajah Anda. Selanjutnya "2" di sini adalah string, bukan angka.

Hal ini tentu akan sangat membingunkan, bukan?

Tipe konversi di Perl

Pada sebagian besar bahasa pemrograman jenis-jenis operand menentukan bagaimana sebuah operator bekerja. Yaitu, menambahkan dua angka menghasilkan penjumlahan, sementara menambahkan dua string akan menggabungkan keduanya. Fungsi ini disebut 'operator overloading'.

Perl, bekerja sebaliknya.

Di Perl, operator adalah sesuatu yang mendefinisikan bagaimana sebuah operand digunakan.

Artinya, jika Anda menggunakan operasi bilangan (contohnya penjumlahan) maka kedua nilainya secara otomatis dikonversikan ke dalam angka. Jika Anda melakukan operasi string (contohnya penggabungan) maka kedua nilainya dikonversikan ke dalam string.

Programmer bahasa C mungkin menyebutnya casting namun istilah ini tidak digunakan dalam Perl. Mungkin karena segalanya otomatis.

Perl tidak peduli apakah Anda menulis sesuatu sebagai angka atau string. Perl mengkonversikan keduanya secara otomatis berdasarkan konteksnya.

Konversi angka => string itu mudah. Hanya seperti membayangkan ada "" mengapit sebuah angka.

Konversi string => angka mungkin membuat Anda berpikir sejenak. Jika sebuah string tampak seperti angka bagi Perl, maka mudah. Nilai yang berupa angka adalah hal yang sama. Tanpa tanda petik.

Jika ada suatu karakter yang menahan Perl dari mengkonversi string ke angka, maka Perl akan menggunakannya sebanyak yang ia mampu pada sisi kiri string untuk angka dan mengabaikan sisanya.

Berikut saya tunjukkan beberapa contohnya:

Original   As string   As number

  42         "42"        42
  0.3        "0.3"       0.3
 "42"        "42"        42
 "0.3"       "0.3"       0.3

 "4z"        "4z"        4        (*)
 "4z3"       "4z3"       4        (*)
 "0.3y9"     "0.3y9"     0.3      (*)
 "xyz"       "xyz"       0        (*)
 ""          ""          0        (*)
 "23\n"      "23\n"      23

Pada kasus-kasus di mana konversi string ke angka berjalan tidak sempurna, kecuali yang terakhir, Perl akan mengeluarkan peringatan. Tentu, diasumsikan Anda menggunakan use warnings seperti yang direkomendasikan.

Contoh

Sekarang Anda lihat tabel tersebut, mari lihat kodenya:

use strict;
use warnings;

my $x = "4T";
my $y = 3;

Penggabungan mengkonversikan kedua nilai tersebut ke dalam string:

print $x . $y;    # 4T3

Penjumlahan angka mengkonversikan kedua nilai ke dalam angka:

print $x + $y;  # 7
                # Argument "4T" isn't numeric in addition (+) at ...

Argument bukan angka

Itu adalah peringatan yang akan Anda dapat ketika Perl mencoba mengkonversikan sebuah string ke dalam angka dan konversinya tak sempurna.

Ada banyak peringatan dan pesan kesalahan lainnya di Perl. Contohnya Simbol global dan Penggunaan nilai tak terinisiasi.

Bagaimana menghindari munculnya pesan peringatan?

Ini sangat menyenangkan karena Perl akan memperingatkan Anda (jika diminta demikian) ketika tipe konversinya tak sempurna, tapi tidak adakah fungsi seperti is_number yang akan memeriksa jika string yang diberikan benar-benar sebuah angka?

Ya dan tidak.

Perl tidak memiliki fungsi is_number seolah ini semacam komitmen bahwa pengembang Perl tahu angka itu seperti apa. Sayangnya banyak orang yang tidak sepenuhnya setuju terhadap hal ini. Ada beberapa sistem yang menerima ".2" sebagai angka, namun sistem-sistem lain tidak menerimanya. Bahkan tidak jarang jika "2" tidak diterima, namun ada sistem di mana ia diterima sepenuhnya sebagai angka.

Bahkan ada tempat di mana 0xAB dianggap sebagai angka. Angka heksadesimal.

Jadi tidak ada fungsi is_number, tapi ada fungsi yang disebut looks_like_number.

Itulah yang Anda pikirkan. Ia akan memeriksa apakah string yang ditulis tampak seperti angka bagi Perl.

Ini sudah tersedia dalam modul Scalar::Util dan Anda dapat menggunakannya seperti berikut:

use strict;
use warnings;

use Scalar::Util qw(looks_like_number);

print "Berapa potong roti yang akan saya beli? ";
my $potong = <STDIN>;
chomp $potong;

if (looks_like_number($potong)) {
    print "Saya mengerti...\n";
} else {
    print "Maaf, saya tidak mengerti\n";
}

Jangan lupa susunya!

Author

Gabor Szabo (szabgab) Gabor Szabo