Comme Perl convertit une chaîne en nombre

N'importe quelle chaîne dans le langage de programmation Perl, vous pouvez l'utiliser comme un nombre. Voici un exemple:

▶ Run
#!/usr/bin/perl

my $str = 'Hello';

print $str + 100;

Le programme affichera le nombre de 100. Ligne 'Hello' lors de l'utilisation dans les opérations arithmétiques est le nombre de 0. Le nombre de 0 plus 100 sera 100 et c'est ce que nous verrons à l'écran. Souvent utilisé le mot "numérique" contexte " pour désigner que la valeur de l'opération est utilisé comme un nombre.

La chaîne de 'Hello' dans un contexte numérique est 0. Mais pas toutes les lignes de Perl sont à zéro.

Dans ce cas, si au début de la ligne vont de les chiffres, le nombre est de l'ensemble de ces chiffres. Voici un exemple:

▶ Run
#!/usr/bin/perl

my $str = '23ASDF';

print $str + 0;

Le programme affichera le nombre de 23.

Voici quelques exemples, la chaîne et le nombre dans lequel elle se développe lors de l'utilisation dans un contexte numérique:

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

Voici un script qui affiche les mêmes données:

▶ 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 Perl script a use warnings; (ce qui est pratiquement toujours la peine de le faire), alors l'utilisation d'une chaîne dans un contexte numérique affiche sur la sortie d'erreur standard avertissement:

▶ Run
#!/usr/bin/perl

use strict;
use warnings;

my $str = 'Hello';

print $str + 100;

Voici la sortie du programme:

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

Recommandation

Il existe une recommandation de ne pas utiliser cette fonction de la langue. Si vous avez besoin d'obtenir le nombre de lignes, faites-le clairement à l'aide d'une expression régulière. Ainsi, vous serez en mesure de décrire avec précision le format dans lequel vous vous attendez à obtenir des données et être en mesure de attraper une situation où les données arrivent dans le mauvais format (au lieu de tacite plus de zéro).

Voici un exemple de code. Nous savons sur les données au début de la ligne est un nombre entier et nous avons besoin de calculer la somme de toutes les les nombres dans toutes les lignes.

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

Lorsque vous exécutez ce programme, nous obtenons une erreur String 'nine lemons' is in incorrect format at script.pl line 19.. Grâce à cette nous voyons que dans les données d'un problème. En fonction de ce que nous pouvons ou corriger les données, au lieu d'une chaîne 'nine lemons' utiliser la chaîne de '9 lemons', ou pouvons explicitement ignorer cette ligne dans le cycle de next if $str eq 'nine lemons'.

Si nous en avons profité un moyen standard de Perl sur la conversion de la chaîne en nombre, la boucle serait beaucoup plus simple:

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

Mais dans ce cas, nous n'aurions pas appris que les données ne correspondent pas à ce format que nous attendons.

Autres articles