Hvordan Perl konverterer strenge til tal

Enhver streng i programmeringssproget Perl kan bruges som et tal. Her er et eksempel:

▶ Run
#!/usr/bin/perl

my $str = 'Hello';

print $str + 100;

Programmet vil vise antallet 100. String 'Hello' , når det bruges i aritmetiske operationer er antallet 0. Antallet 0 plus 100 vil 100 , og det er, hvad vi vil se på skærmen. Ofte bruges ordene "numeriske led" til at henvise til hvad er værdien af driften bruges som et tal.

String 'Hello' i en numeriske led det 0. Men ikke alle strengene i Perl er nul.

Hvis du er i begyndelsen af en linje, der er cifre, så antallet bliver summen af disse tal. Her er et eksempel:

▶ Run
#!/usr/bin/perl

my $str = '23ASDF';

print $str + 0;

Programmet vil vise antallet 23.

Her er et par eksempler, den streng, og det nummer, i hvilket det bliver, når de anvendes i en numerisk kontekst:

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

Her er et script, der vil vise de samme data:

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

Hvis Perl-script er use warnings; (som næsten altid værd at gøre), så brug en snor, i numerisk led vil udskrive på STDERR advarsel:

▶ Run
#!/usr/bin/perl

use strict;
use warnings;

my $str = 'Hello';

print $str + 100;

Her er program output:

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

Anbefaling

Der er en anbefaling, ikke at bruge denne funktion i sproget. Hvis du har brug for at få et nummer fra strengen, gør det udtrykkeligt med hjælp af regulære udtryk. Så kan du bare beskrive det format, som du forventer at modtage data, og vil være i stand for at fange den situation, hvor data kommer i de forkerte format (i stedet for lydløs modtagelsen af nul).

Her er et eksempel kode. Vi vide, om de data, der i begyndelsen af strengen er et heltal, og vi er nødt til at beregne summen af alle tal i alle rækker.

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

Når du kører dette program får vi fejl String 'nine lemons' is in incorrect format at script.pl line 19.. Tak vi kan se, at i de data, der er et problem. Afhængigt af, hvordan vi kan enten rette data i stedet for en streng 'nine lemons' brug string '9 lemons', eller du kan udtrykkeligt ignorere denne linje i en løkke next if $str eq 'nine lemons'.

Hvis vi havde brugt den normale måde at Perl konvertere strengen til et tal, løkken ville være meget enklere:

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

Men i dette tilfælde, ville vi ikke vide, at data ikke svarer til det format, vi forventer.

Andre artikler