web-dev-qa-db-fra.com

Comment puis-je convertir une chaîne en un nombre en Perl?

Comment convertir une chaîne contenant un nombre en valeur numérique en Perl?

79
Anton

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

% Perl -e 'print "5.45" + 0.1;'
5.55
87
Alnitak

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
68
porquero

Perl est un langage contextuel. Il ne fait pas son travail en fonction des données que vous lui donnez. Au lieu de cela, il explique 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 chiffres:

# numeric addition with strings:
my $sum = '5.45' + '0.01'; # 5.46

Si vous faites des chaînes de caractères, vous obtenez des chaînes:

# string replication with numbers:
my $string = ( 45/2 ) x 4; # "22.522.522.522.5"

Perl sait surtout quoi faire et c'est généralement juste. Une autre façon de dire la même chose est que Perl se soucie plus des verbes que des noms.

Essayez-vous de faire quelque chose et cela ne fonctionne pas?

40
brian d foy

Google m'a conduit ici tout en cherchant sur la même question que phill a posée (tri des flotteurs). J'ai donc pensé qu'il valait la peine de poster la réponse malgré le fil assez ancien. Je suis nouveau à Perl et je continue à avoir la tête dans les yeux, 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 indiquer à la sorte de trier les valeurs sous forme de nombres et non de chaînes . i.e.

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
Norm

Si je comprends bien, int () n'est pas conçu comme une fonction de conversion pour désigner le type de données; il est simplement utilisé ici pour définir le contexte sous la forme d'un calcul arithmétique. J'ai déjà utilisé (0 + $ val) par le passé pour m'assurer que $ val est traité comme un nombre.

7
mccutchm
$var += 0

probablement ce que vous voulez. Soyez averti cependant, si $ var est une chaîne qui ne peut pas être convertie en numérique, vous obtiendrez l'erreur et $ var sera réinitialisé sur 0 :

my $var = 'abc123';
print "var = $var\n";
$var += 0;
print "var = $var\n";

les journaux

var = abc123
Argument "abc123" isn't numeric in addition (+) at test.pl line 7.
var = 0
6
indexless

En réalité, Perl n'a que trois types: les scalaires, les tableaux et les 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
Rini

Dans les comparaisons, un scalaire est un numéro de chaîne. Et ce n'est pas toujours décidable. Je peux signaler un cas où Perl a récupéré un float en notation "scientifique" et l'a utilisé quelques lignes plus bas 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 les bons programmeurs) a aidé.

1
Steffen Moeller

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, selon les opérateurs que vous utilisez .$a = 7*6; $b = 7x6; print "$a $b\n";
Vous obtenez 42 777777.

Il y a cependant une différence subtile. 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 sans guillemets 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, car vous avez utilisé un opérateur numérique. 

J'ai remarqué cela en essayant de comparer deux hachages avec Data::Dumper.

0
SzG