Bagaimana Perl mengkonversi string ke angka

Setiap string dalam Perl bahasa pemrograman yang dapat digunakan sebagai nomor. Berikut ini sebuah contoh:

▶ Run
#!/usr/bin/perl

my $str = 'Hello';

print $str + 100;

Program ini akan menampilkan jumlah 100. String 'Hello' bila digunakan dalam operasi aritmatika adalah jumlah 0. Jumlah 0 plus 100 akan 100 dan itu adalah apa yang akan kita lihat di layar. Sering digunakan kata-kata "numerik konteks" untuk merujuk kepada apa nilai dari operasi ini digunakan sebagai sebuah nomor.

String 'Hello' di angka konteks itu 0. Tapi tidak semua string dalam Perl adalah nol.

Jika di awal baris yang digit, maka nomor tersebut menjadi jumlah dari angka-angka ini. Berikut ini sebuah contoh:

▶ Run
#!/usr/bin/perl

my $str = '23ASDF';

print $str + 0;

Program ini akan menampilkan jumlah 23.

Berikut ini adalah beberapa contoh, string dan jumlah di mana ternyata ketika digunakan dalam numerik konteks:

''          -> 0
'1.0ASDF'   -> 1
'1.2ADF'    -> 1.2
'0123ASDF'  -> 123
' 34ASDF'   -> 34
'0x13ABC'   -> 0
'0b10ABC'   -> 0
'1e+25ASDF' -> 1e+25
' +7ASDF'   -> 7
'-13ABC'    -> -13
'--13ABC'   -> 0
' 10 100'   -> 10

Berikut adalah script yang akan menampilkan data yang sama:

▶ Run
#!/usr/bin/perl

use feature qw(say);

foreach my $str ('', '1.0ASDF', '1.2ADF', '0123ASDF', ' 34ASDF',  '0x13ABC', '0b10ABC', '1e+25ASDF', ' +7ASDF', '-13ABC', '--13ABC', ' 10 100') {
     say "'$str' -> " . ($str + 0);
}

use warnings;

Jika Perl script use warnings; (yang hampir selalu layak dilakukan), kemudian menggunakan sebuah string dalam konteks numerik akan mencetak pada STDERR peringatan:

▶ Run
#!/usr/bin/perl

use strict;
use warnings;

my $str = 'Hello';

print $str + 100;

Berikut adalah output program:

Argument "Hello" isn't numeric in addition (+) at script.pl line 8.
100

Rekomendasi

Ada rekomendasi untuk tidak menggunakan fitur ini bahasa. Jika anda perlu untuk mendapatkan jumlah dari string, lakukan secara eksplisit dengan bantuan dari ekspresi reguler. Sehingga anda hanya dapat menggambarkan format yang anda harapkan untuk menerima data dan akan dapat untuk menangkap situasi saat data tiba di salah format (bukan diam penerimaan nol).

Berikut adalah contoh kode. Kita tahu tentang data di awal string adalah bilangan bulat dan kita perlu untuk menghitung jumlah semua angka-angka pada semua baris.

▶ Run
#!/usr/bin/perl

use strict;
use warnings;

my @strings = (
    '10 apples',
    '0 potatoes',
    '8 oranges',
    'nine lemons',
);

my $sum = 0;

foreach my $str (@strings) {
    if ($str =~ /^([0-9]+)/) {
        $sum += $1;
    } else {
        die "String '$str' is in incorrect format";
    }
}

print $sum;

Ketika anda menjalankan program ini kita mendapatkan kesalahan String 'nine lemons' is in incorrect format at script.pl line 19.. Terima kasih kita melihat bahwa dalam data ada masalah. Tergantung pada bagaimana kita dapat memperbaiki data yang bukan string 'nine lemons' gunakan string '9 lemons', atau anda dapat secara eksplisit mengabaikan baris ini dalam loop next if $str eq 'nine lemons'.

Jika kita telah menggunakan cara standar yang Perl mengkonversi string ke number, loop akan menjadi jauh lebih sederhana:

foreach my $str (@strings) {
    $sum += $str;
}

Tapi dalam kasus ini, kita tidak akan tahu bahwa data tidak sesuai format yang kita harapkan.

Artikel lainnya