Question Bug ?

Plus d'informations
il y a 16 ans 9 mois #461 par Berfini
Bug ? a été créé par Berfini
J'ai constaté un resultat pour le moins surprenant :
$a = 27
$b = \"27\"
$c = $a | out-string

Et voila ce que j'obtiens :
$a -eq $b -> True
$a -eq $c -> True
$b -eq $c -> False

Or mathematiquement si a=b et a=c alors b=c.

Quelqu'un aurait une explication a ce resultat pour le moins surprenant et illogique ?

Gaby

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 16 ans 9 mois #467 par Jerome Cordel
Réponse de Jerome Cordel sur le sujet Re:Bug ?
Vouloir trouver une logique dans un language à typage dynamique, c'est un peu la quadrature du cercle.
un entier = une chaine (expression booléenne VRAIE) est déjà une hérésie.

Dans ton code, ce qui attire l'attention c'est :
$a | out-string

$a.length
2
$b.length
2
$c.length
4

donc forcément $b -ne $c

j'ai vaguement lu l'aide sur \"out-string\", mais ça me saoule. Je débute avec ce soit-disant langage de nouvelle génération, et je dois dire que ça doit plaire aux Aficionados du C, C++, C#, Java et autres cryptiques langages.

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 16 ans 9 mois #469 par Berfini
Réponse de Berfini sur le sujet Re:Bug ?
ok que $b -ne $c mais pourquoi $a -eq $c alors ?

Gaby

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 16 ans 9 mois #471 par Arnaud Petitjean
Réponse de Arnaud Petitjean sur le sujet Re:Bug ?
Il faut faire très attention avec les opérateurs de comparaison car on peut vite faire une erreur.
Il faut différencier les opérateurs mathématiques des opérateurs de chaine. Or en l'occurence -eq est un opérateur mathématique. Pour tester des chaines il faut utiliser soit -like, soit -match pour les expressions régulières.

D'autre part Out-String n'est pas la commande adaptée pour faire du transtypage car elle sert à concatener un tableau de chaines. Il faut utiliser la syntaxe suivante :
[code:1]
$a = 27
$b = \"27\"
$c = [string]$a
[/code:1]

Et là les comparaisons marchent avec les bons opérateurs.

Cordialement,

Arnaud Petitjean

MVP PowerShell et créateur de ce magnifique forum :-)
Auteur de 6 livres PowerShell aux éditions ENI
Fondateur de la société Start-Scripting
Besoin d'une formation PowerShell ?

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 16 ans 9 mois #472 par Berfini
Réponse de Berfini sur le sujet Re:Bug ?
Je te remercie

Gaby

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 16 ans 9 mois #474 par Jerome Cordel
Réponse de Jerome Cordel sur le sujet Re:Bug ?
Ce que dit Admin n'est pas exact.
-eq est le comparateur d'égalité quelque soit le type des variables.

Par contre Powershell tente toujours de convertir la deuxième valeur en correspondance du type de la première valeur.

Ainsi
$a est du type entier
$b est du type chaine (sur 2 caractères)
$c est du type chaine (mais est sur quatre caractères)

ainsi \"27\" donne 27 en entier et \"27 \" aussi

c'est pour moi la seule explication rationnelle.
pour preuve \"Hello\" -eq \"Hello\" donne True

bonne journée

Connexion ou Créer un compte pour participer à la conversation.

Temps de génération de la page : 0.072 secondes
Propulsé par Kunena