Wie Perl wandelt Zeichenfolgen in zahlen

Jede Zeile in der Programmiersprache Perl kann als zahlen. Hier ist ein Beispiel:

▶ Run
#!/usr/bin/perl

my $str = 'Hello';

print $str + 100;

Das Programm zeigt die Anzahl der 100. Zeile 'Hello' bei der Verwendung in einer arithmetischen Operation ist eine Zahl 0. Die Zahl der 0 Plus 100 wird 100 und das ist, was wir auf dem Bildschirm sehen. Oft werden die Worte "numerischen Kontext" für die Bezeichnung dass der Wert in der Operation verwendet wird als Zahl.

Zeile 'Hello' im zahlenkontext ist 0. Aber nicht alle Zeilen in Perl sind null.

Falls am Anfang der Zeile kommen die zahlen, dann Zahl wird die Summe dieser zahlen. Hier ist ein Beispiel:

▶ Run
#!/usr/bin/perl

my $str = '23ASDF';

print $str + 0;

Das Programm zeigt die Anzahl der 23.

Hier noch ein paar Beispiele, die Zeile und die Anzahl der in die es verwandelt sich bei der Verwendung in einem numerischen Kontext:

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

Hier ist ein Skript, das zeigt die selben Daten:

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

Wenn im Perl-Skript gibt es use warnings; (was fast immer tun sollte), dann verwenden Sie eine Schnur im zahlenkontext zeigt eine Warnung auf STDERR:

▶ Run
#!/usr/bin/perl

use strict;
use warnings;

my $str = 'Hello';

print $str + 100;

Hier ist die Ausgabe des Programms:

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

Empfehlung

Es ist eine Empfehlung, nicht diese Funktion der Sprache. Wenn Sie brauchen, um eine Zahl aus einem String zu bekommen, tun Sie es eindeutig mit Hilfe eines regulären Ausdrucks. So können Sie genau beschreiben das Format, in dem Sie erwarten, dass die Daten und können fangen Sie die Situation, wenn die Daten kommen im falschen Format (anstelle der stillschweigenden null Empfang).

Hier ist ein Beispiel Code. Wir wissen genau über die Daten, dass am Anfang der Zeile ist eine ganze Zahl und wir müssen berechnen die Summe aller zahlen in allen Zeilen.

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

Beim Start dieses Programms erhalten wir einen Fehler String 'nine lemons' is in incorrect format at script.pl line 19.. Dadurch wir sehen, dass in den Daten ein Problem. Je nachdem wie es richtig ist, können wir entweder die Daten korrigieren, statt die Zeilen 'nine lemons' verwenden Sie den String '9 lemons', können entweder explizit ignorieren diese Zeile in einer Schleife next if $str eq 'nine lemons'.

Wenn wir nutzten das standardtool von Perl nach der Konvertierung einer Zeichenfolge in eine Zahl, wird die Schleife wäre viel einfacher:

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

Aber in diesem Fall würden wir nicht gelernt haben, dass die Daten entsprechen nicht dem Format, das wir erwarten.

Andere Artikel