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?

76
demandé sur mskfisher 2008-11-14 03:39:16

9 réponses

Vous n'avez pas besoin de le convertir du tout:

% perl -e 'print "5.45" + 0.1;'
5.55
87
répondu Alnitak 2008-11-14 00:43:28

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
63
répondu porquero 2011-12-16 19:26:24

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?

40
répondu brian d foy 2014-01-30 15:09:36

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

9
répondu Norm 2010-05-14 16:27:42

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.

6
répondu mccutchm 2012-08-14 19:08:14
$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
6
répondu indexless 2013-07-14 08:12:31

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
3
répondu Rini 2013-01-07 12:44:36

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é.

1
répondu Steffen Moeller 2012-09-25 16:45:21

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.

0
répondu SzG 2013-07-30 15:56:09