Come Perl converte le stringhe in numeri

Qualsiasi stringa in linguaggio di programmazione Perl può essere utilizzato come un numero. Ecco un esempio:

▶ Run
#!/usr/bin/perl

my $str = 'Hello';

print $str + 100;

Il programma visualizza il numero di 100. Stringa 'Hello' quando si utilizza in un'operazione aritmetica è il numero di 0. Il numero di 0 plus 100 sarà 100 e questo è ciò che noi vediamo sullo schermo. Spesso vengono utilizzate le parole "numerico contesto" per indicare che valore viene utilizzato come numero.

Stringa 'Hello' numericamente contesto è 0. Ma non tutte le righe di Perl sono zero.

In tal caso, se all'inizio di una riga vanno i numeri, allora il numero diventa l'insieme di questi numeri. Ecco un esempio:

▶ Run
#!/usr/bin/perl

my $str = '23ASDF';

print $str + 0;

Il programma visualizza il numero di 23.

Ecco un paio di esempi, la riga e il numero che si sviluppa quando si utilizza in un contesto numerico:

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

Ecco uno script che visualizza questi dati:

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

Se in Perl script ci sono use warnings; (che è quasi sempre la pena di fare), allora l'uso di riga in un contesto numerico visualizza STDERR avviso:

▶ Run
#!/usr/bin/perl

use strict;
use warnings;

my $str = 'Hello';

print $str + 100;

Ecco l'output del programma:

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

Raccomandazione

C'è la raccomandazione di non utilizzare questa feature del linguaggio. Se avete bisogno di ottenere il numero di righe, farlo in modo esplicito con l'espressione regolare. Così sarete in grado di descrivere con precisione il formato in cui ci si aspetta di ottenere dati ed essere in grado di prendere la situazione quando i dati vengono nel formato sbagliato (invece di tacito ottenere zero).

Ecco un esempio di codice. Sappiamo esattamente i dati pro che all'inizio della stringa è un numero intero e abbiamo bisogno di calcolare la somma di tutti i numeri in tutte le righe.

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

Quando si esegue questo programma avremo un errore String 'nine lemons' is in incorrect format at script.pl line 19.. Grazie a questo vediamo che c'è un problema. A seconda di come correttamente, possiamo o correggere i dati, invece di comando 'nine lemons' utilizzare la stringa '9 lemons', o possiamo chiaramente ignorare questa stringa nel ciclo next if $str eq 'nine lemons'.

Se abbiamo usato lo strumento standard di Perl per convertire una stringa in un numero, il ciclo sarebbe stato molto più facile:

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

Ma in questo caso non avremmo imparato che i dati non corrispondono al formato che ci aspettiamo.

Altri articoli