Como Perl converte uma cadeia de caracteres em números

Qualquer seqüência de caracteres na linguagem de programação Perl que você pode usar como um número. Aqui está um exemplo:

▶ Run
#!/usr/bin/perl

my $str = 'Hello';

print $str + 100;

O programa exibirá o número de 100. Linha 'Hello' ao usar a aritmética, a operação é o número de 0. O número de 0 plus 100 será 100 e é isso que veremos na tela. Muitas vezes são usadas as palavras "numérico contexto" para se referir a que o valor da operação é usado como um número.

Linha 'Hello' em um contexto numérico é 0. Mas nem todas as linhas em Perl são zero.

Se no início da linha vão os números, o número torna-se a totalidade desses números. Aqui está um exemplo:

▶ Run
#!/usr/bin/perl

my $str = '23ASDF';

print $str + 0;

O programa exibirá o número de 23.

Eis alguns exemplos, a linha e o número em que ele se transforma quando usada em um 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

Aqui está um script que exibe os mesmos dados:

▶ 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 em Perl script tem use warnings; (que quase sempre vale a pena fazer), então o uso de comandos em um contexto numérico irá STDERR aviso:

▶ Run
#!/usr/bin/perl

use strict;
use warnings;

my $str = 'Hello';

print $str + 100;

Aqui está a saída do programa:

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

Recomendação

Há a recomendação de não usar esta фичу da linguagem. Se você precisa de se apossar de um número de linha, então faça isso claramente com uma expressão regular. Assim você será capaz de descrever com precisão o formato que você espera obter dados e ser capaz de pegar uma situação em que os dados chegam no formato correto (em vez de tácito de obter zero).

Aqui está um exemplo de código. Nós sabemos exatamente sobre dados que, no início da linha, está um número inteiro e precisamos de calcular a soma de todos os números em todas as linhas.

▶ 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 você executa este programa, teremos um erro String 'nine lemons' is in incorrect format at script.pl line 19.. Graças a este vemos que este é o problema. Independentemente de como fazer corretamente, podemos corrigir os dados, em vez de uma string 'nine lemons' usar a seqüência de '9 lemons', ou podemos explicitamente ignorar esta linha no ciclo de next if $str eq 'nine lemons'.

Se nós usamos a ferramenta padrão do Perl de conversão de string em número, o ciclo seria muito mais fácil:

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

Mas neste caso nós não soubesse que os dados não correspondem ao formato que esperamos.

Outros artigos