Como Perl convierte una cadena en un número de

Cualquier cadena en el lenguaje de programación Perl se puede utilizar como un número. He aquí un ejemplo:

▶ Run
#!/usr/bin/perl

my $str = 'Hello';

print $str + 100;

El programa mostrará en pantalla el número de 100. La cadena de 'Hello' cuando se utiliza en una operación aritmética es el número de 0. El número de 0 plus 100 se 100 y es lo que veremos en la pantalla. A menudo se utilizan las palabras "numérico contexto" para referirse a la que el valor de la operación se utiliza como un número.

La cadena de 'Hello' en un contexto numérico es 0. Pero no todas las filas en Perl son cero.

En caso de que al principio de la línea van los números, el número se convierte en el conjunto de estas cifras. He aquí un ejemplo:

▶ Run
#!/usr/bin/perl

my $str = '23ASDF';

print $str + 0;

El programa mostrará en pantalla el número de 23.

Aquí hay algunos ejemplos de la línea y el número en que se convierte cuando se utiliza en un contexto numérico:

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

Aquí está la escritura, la cual revela estos datos:

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

Si en Perl script tiene use warnings; (que casi siempre vale la pena hacerlo), entonces el uso de cadenas en un contexto numérico muestra STDERR advertencia:

▶ Run
#!/usr/bin/perl

use strict;
use warnings;

my $str = 'Hello';

print $str + 100;

He aquí la conclusión del programa:

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

Recomendación

Existe la recomendación de no utilizar esta фичу de la lengua. Si es necesario obtener el número de la fila, entonces hazlo de forma explícita con la expresión regular. Así que usted será capaz de describir con precisión el formato en el que se espera obtener datos y ser capaz de atrapar la situación cuando los datos vienen en el formato correcto (en lugar de la complicidad de obtener cero).

He aquí un ejemplo de código. Sabemos exactamente sobre los datos que en el comienzo de la barra se encuentra un número entero y tenemos que calcular la suma de todos los los números de todas las filas.

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

Cuando se ejecuta este programa obtendremos un error String 'nine lemons' is in incorrect format at script.pl line 19.. Gracias a esto vemos que en los datos de un problema. Dependiendo de la forma correcta podemos corregir los datos, en lugar de una cadena 'nine lemons' usar la barra de '9 lemons', o podemos claramente ignorar esta línea en el ciclo de next if $str eq 'nine lemons'.

Si hemos hecho uso de una herramienta estándar de Perl para convertir una cadena en un número, el bucle sería mucho más fácil:

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

Pero en este caso no nos enteramos de que los datos no corresponden al formato que esperamos.

Otros articulos