Question
Bug ?
- Berfini
- Auteur du sujet
- Hors Ligne
- Membre premium
Réduire
Plus d'informations
- Messages : 86
- Remerciements reçus 0
il y a 16 ans 9 mois #461
par Berfini
Gaby
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 ?
$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.
- Jerome Cordel
- Hors Ligne
- Nouveau membre
Réduire
Plus d'informations
- Messages : 3
- Remerciements reçus 0
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.
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.
- Berfini
- Auteur du sujet
- Hors Ligne
- Membre premium
Réduire
Plus d'informations
- Messages : 86
- Remerciements reçus 0
- Arnaud Petitjean
- Hors Ligne
- Modérateur
il y a 16 ans 9 mois #471
par 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 ?
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
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.
- Berfini
- Auteur du sujet
- Hors Ligne
- Membre premium
Réduire
Plus d'informations
- Messages : 86
- Remerciements reçus 0
- Jerome Cordel
- Hors Ligne
- Nouveau membre
Réduire
Plus d'informations
- Messages : 3
- Remerciements reçus 0
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
-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
- Vous êtes ici :
- Accueil
- forum
- PowerShell
- Discussions générales
- Bug ?