Jak Perl konwertuje ciąg na liczby

Dowolny ciąg znaków w języku programowania Perl można używać jako liczby. Oto przykład:

▶ Run
#!/usr/bin/perl

my $str = 'Hello';

print $str + 100;

Program wypisze na ekran liczba 100. Wiersz 'Hello' przy użyciu operacji arytmetycznych — to liczba 0. Liczba 0 plus 100 będzie 100 i to właśnie widzimy na ekranie. Często używane słowa "liczbowy kontekst" dla oznaczenia że wartość w zabiegu wykorzystywany jest jako liczba.

Wiersz 'Hello' w kontekście numeryczne to 0. Ale nie wszystkie wiersze w Perlu są zerem.

W przypadku, gdy w początku wiersza idą cyfry, liczby staje się zbiór tych liczb. Oto przykład:

▶ Run
#!/usr/bin/perl

my $str = '23ASDF';

print $str + 0;

Program wypisze na ekran liczba 23.

Oto jeszcze kilka przykładów, wiersz i liczba na która staje się ono użyte w kontekście numeryczne:

''          -> 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

Oto skrypt, który wypisze te same dane:

▶ 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;

Jeśli w skrypcie Perl jest use warnings; (co prawie zawsze warto robić), to wtedy korzystanie z wiersza w kontekście numeryczne wyprowadzi na STDERR ostrzeżenie:

▶ Run
#!/usr/bin/perl

use strict;
use warnings;

my $str = 'Hello';

print $str + 100;

Oto wyjście z programu:

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

Rekomendacja

Istnieje zalecenie nie wykorzystać tę funkcjonalność języka. Jeśli potrzebujesz zdobyć liczba z wiersza, to rób to wyraźnie za pomocą wyrażenia regularnego. W ten sposób można dokładnie opisać format w którym możesz oczekiwać dane i można złapać sytuację, gdy dane są w złym formacie (zamiast cichego uzyskać zera).

Oto przykład kodu. Wiemy o dane, że na samym początku wierszu znajduje się liczba całkowita i musimy policzyć sumę wszystkich liczb we wszystkich wierszach.

▶ 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;

Po uruchomieniu tego programu otrzymamy błąd String 'nine lemons' is in incorrect format at script.pl line 19.. Dzięki temu widzimy, że w danych jest problem. W zależności o tego jak prawidłowo, możemy albo poprawić dane, zamiast wiersza 'nine lemons' wiersz '9 lemons', albo możemy wyraźnie ignoruje ten wiersz w cyklu next if $str eq 'nine lemons'.

Gdybyśmy skorzystali z standardowym środkiem Perl zamiany wiersza w liczbę, cykl byłby o wiele łatwiejsze:

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

Ale w tym przypadku nie wiedzielibyśmy, że dane nie są zgodne z tym formatem który oczekujemy.

Inne artykuły