OVH Cloud OVH Cloud

Comparaison fausse

7 réponses
Avatar
Delf
Bonjour,

Dans un script perl, je lis deux fichiers qui contiennent chacun un chiffre
puis je les compare et c'est là que j'ai un probleme. Par exemple:

$one = 333
$two = 4444

if ($one gt $two) <- On rentre ici
if ($one > $two) <- idem

J'ai testé les deux au cas où... on rentre tjrs dans le mauvais block...

Pourquoi ? Merci.

--
Delf

7 réponses

Avatar
Thibault
Delf wrote:
Bonjour,



Salut,


Dans un script perl, je lis deux fichiers qui contiennent chacun un chiffre
puis je les compare et c'est là que j'ai un probleme. Par exemple:

$one = 333
$two = 4444

if ($one gt $two) <- On rentre ici
if ($one > $two) <- idem

J'ai testé les deux au cas où... on rentre tjrs dans le mauvais block...

Pourquoi ? Merci.


C'est en fait parce que tes variables extraites d'un fichier ne sont pas
des entiers, ce sont des chaines de caracteres : "333" et "4444"
il faut les transformer en int avec:
$one = int($one);
$two = int($two);
et tout devrait rentrer dans l'ordre.


--
Delf




A+
Thibault

Avatar
Michel Rodriguez
Delf wrote:


Dans un script perl, je lis deux fichiers qui contiennent chacun un
chiffre puis je les compare et c'est là que j'ai un probleme. Par exemple:

$one = 333
$two = 4444
if ($one gt $two) <- On rentre ici
if ($one > $two) <- idem

J'ai testé les deux au cas où... on rentre tjrs dans le mauvais block...
Pourquoi ? Merci.


Si tu nous montrais tout le code on pourrait te dire. Ce que tu nous montre
c'est des extraits qu'on ne peut pas faire tourner. Un petit cas de test
qu'on peut executer nous permettrait de te donner plus d'info.

En tout cas ca devrait marcher (et il n'y a vraiment pas besoin de convertir
les chaines en entier, on est pas en C, Perl fait ca tres bieng tout seul).

En tout cas ca ca marche, y compris si tes nombres ont un n ou un r a la
fin (puisque tu les lis depuis un fichier c'est une possibilite):
#!/usr/bin/perl -w
use strict;

my $one = 333;
my $two = 4444;

foreach my $exp ( '$one gt $two' , '$one > $two', '$one < $two', '$one lt
$two')
{ print eval $exp ? "$exp est vrain" : "$exp est fauxn"; }

print "n";

my $one_nl= "333n";
my $two_nl= "4444n";

foreach my $exp ( '$one_nl gt $two_nl' , '$one_nl > $two_nl', '$one_nl <
$two_nl', '$one_nl lt $two_nl')
{ print eval $exp ? "$exp est vrain" : "$exp est fauxn"; }

print "n";

my $one_lr= "333r";
my $two_lr= "4444r";

foreach my $exp ( '$one_lr gt $two_lr' , '$one_lr > $two_lr', '$one_lr <
$two_lr', '$one_lr lt $two_lr')
{ print eval $exp ? "$exp est vrain" : "$exp est fauxn"; }


donne:


$one gt $two est faux
$one > $two est faux
$one < $two est vrai
$one lt $two est vrai

$one_nl gt $two_nl est faux
$one_nl > $two_nl est faux
$one_nl < $two_nl est vrai
$one_nl lt $two_nl est vrai

$one_lr gt $two_lr est faux
$one_lr > $two_lr est faux
$one_lr < $two_lr est vrai
$one_lr lt $two_lr est vrai


__
Michel Rodriguez
Perl &amp; XML
http://xmltwig.com

Avatar
Delf
"dominique" a écrit dans le message news:

es-tu vraiment sur de ton coup ?
verifies bien ton code car ca semble vraiment bisard


J'ai verifié l'etat des variables avec des print...

--
Delf

Avatar
Delf
"Michel Rodriguez" a écrit dans le message news:

En tout cas ca devrait marcher (et il n'y a vraiment pas besoin de
convertir

les chaines en entier, on est pas en C, Perl fait ca tres bieng tout
seul).


J'ai d'abord fait avec ce que m'avait dit Thibault et ca marche. Bizarre...

--
Delf

Avatar
Delf
"Delf" a écrit dans le message news:

Merci bcp ca marche. C'est bizarre de devoir 'caster' en Perl...


Trop vite parlé... ca boucle sur les int()...
Je vais voir ce que c'es...

--
Delf

Avatar
Delf
Erreur de ma part :)

--
Delf
Avatar
Michel Rodriguez
Delf wrote:


J'ai d'abord fait avec ce que m'avait dit Thibault et ca marche.
Bizarre...


Je pense que c'est vraiment pas ca. Ci-dessous un test ou les valeurs sont
lues depuis un fichier, et ou je les traite comme des nombres:

#!/usr/bin/perl -w
use strict;#!/usr/bin/perl -w
use strict;

use Test::More qw(no_plan);

my $test= { '$one gt $two' => '', '$one > $two' => '',
'$one lt $two' => 1, '$one < $two' => 1,
};

my $one = <DATA>;
my $two = <DATA>;

compare( $test, $one, $two);
montre_que_les_variables_sont_des_nombres( $one, $two);

open( TMP, ">tmp") or die "cannot open (write) tmp: $!";
print TMP $one, $two;
close TMP;

open( TMP, "<tmp") or die "cannot open (read) tmp: $!";
$one= <TMP>; $two=<TMP>;

compare( $test, $one, $two);
montre_que_les_variables_sont_des_nombres( $one, $two);

close TMP;

sub compare
{ my( $test, $one, $two)= @_;
my $display_one= formate( $one);
my $display_two= formate( $two);
while( my( $exp, $result)= each %$test)
{ is( eval $exp, $result , "$exp est $result (one : $display_one -
two: $display_two)"); }
}

sub montre_que_les_variables_sont_des_nombres
{ my( $one, $two)= @_;
is( ++$one, "334", "$one++ est bien 334: " . formate( $one));
is( --$two, "443", "$two-- est bien 443: " . formate( $two));
}

sub formate
{ my $var= shift;
$var=~ s{n}{n};
return $var;
}

__DATA__
333
444


__
Michel Rodriguez
Perl &amp; XML
http://xmltwig.com