Comment puis-je convertir une chaîne en nombre en Perl?
Comment convertir une chaîne contenant un nombre en sa valeur numérique en Perl?
9 réponses
Vous n'avez pas besoin de le convertir du tout:
% perl -e 'print "5.45" + 0.1;'
5.55
C'est une solution simple:
Exemple 1
my $var1 = "123abc";
print $var1 + 0;
Résultat
123
Exemple 2
my $var2 = "abc123";
print $var2 + 0;
Résultat
0
Perl est un langage contextuel. Il ne veut pas faire son travail selon les données que vous lui donnez. Au lieu de cela, il détermine comment traiter les données en fonction des opérateurs que vous utilisez et du contexte dans lequel vous les utilisez. Si vous faites des nombres, vous obtenez des nombres:
# numeric addition with strings:
my $sum = '5.45' + '0.01'; # 5.46
Si vous faites des sortes de chaînes, vous obtenez des chaînes:
# string replication with numbers:
my $string = ( 45/2 ) x 4; # "22.522.522.522.5"
Perl comprend surtout ce qu'il faut faire et c'est surtout juste. Une autre façon de dire la même chose est que Perl se soucie plus des verbes que cela ne le les noms.
Essayez-vous de faire quelque chose et cela ne fonctionne pas?
Google m'a conduit ici en cherchant sur la même question que phill a posée (tri des flotteurs), donc j'ai pensé que cela valait la peine de poster la réponse malgré le fait que le fil soit un peu vieux. Je suis nouveau à perl et je reçois toujours ma tête enroulée autour d'elle, mais la déclaration de brian D foy " Perl se soucie plus des verbes que des noms."ci-dessus frappe vraiment le clou sur la tête. Vous n'avez pas besoin de convertir les chaînes en flottants avant d'appliquer le tri. Vous devez dire au tri de trier les valeurs comme les numéros et non des chaînes de caractères. c'est à dire
my @foo = ('1.2', '3.4', '2.1', '4.6');
my @foo_sort = sort {$a <=> $b} @foo;
Voir http://perldoc.perl.org/functions/sort.html pour plus de détails sur le tri
Si je comprends bien int () n'est pas conçu comme une fonction 'cast' pour désigner le type de données, il est simplement utilisé (ab)ici pour définir le contexte comme arithmétique. J'ai (ab)utilisé (0+$val) dans le passé pour s'assurer que $val est traité comme un numéro.
$var += 0
Probablement ce que vous voulez. Soyez averti cependant, si $var is string n'a pas pu être converti en numérique, vous obtiendrez l'erreur, et $var sera réinitialisé à 0:
my $var = 'abc123';
print "var = $var\n";
$var += 0;
print "var = $var\n";
Journaux
var = abc123
Argument "abc123" isn't numeric in addition (+) at test.pl line 7.
var = 0
Perl n'a vraiment que trois types: scalaires, tableaux et hachages. Et même cette distinction est discutable. ;) La façon dont chaque variable est traitée dépend de ce que vous en faites:
% perl -e "print 5.4 . 3.4;"
5.43.4
% perl -e "print '5.4' + '3.4';"
8.8
Dans les comparaisons, Cela fait une différence si un scalaire est un nombre d'une chaîne. Et il n'est pas toujours decidable. Je peux signaler un cas où perl a récupéré un flotteur en notation "scientifique" et l'a utilisé quelques lignes ci-dessous dans une comparaison:
use strict;
....
next unless $line =~ /and your result is:\s*(.*)/;
my $val = $1;
if ($val < 0.001) {
print "this is small\n";
}
Et ici $val
n'a pas été interprété comme numérique, par exemple "2e-77"
extrait de $line
. L'ajout de 0 (ou 0.0 pour de bons programmeurs Ole C) a aidé.
Perl est faiblement typé et basé sur le contexte. De nombreux scalaires peuvent être traités à la fois comme des chaînes et des nombres, en fonction des opérateurs que vous utilisez.
$a = 7*6; $b = 7x6; print "$a $b\n";
Vous obtenez 42 777777
.
Il y a une différence subtile, cependant. Lorsque vous lisez des données numériques d'un fichier texte dans une structure de données, puis que vous les Affichez avec Data::Dumper
, vous remarquerez que vos numéros sont entre guillemets. Perl les traite en interne comme des chaînes.
Lire:$my_hash{$1} = $2 if /(.+)=(.+)\n/;
.
Dump:'foo' => '42'
Si vous voulez des nombres non cotés dans le dump:
Lire:$my_hash{$1} = $2+0 if /(.+)=(.+)\n/;
.
Dump:'foo' => 42
Après $2+0
Perl remarque que vous avez traité $ 2 comme un nombre, parce que vous avez utilisé un opérateur numérique.
J'ai remarqué cela en essayant de comparer deux hachages avec Data::Dumper
.