En Perl, quelle est la différence entre
$status = 500;
y
$status = '500';
En Perl, quelle est la différence entre
$status = 500;
y
$status = '500';
Pas beaucoup. Ils assignent tous les deux cinq cents à $status
. Le format interne utilisé sera initialement différent (IV vs PV, UTF8=0), mais cela n'a pas d'importance pour Perl.
Cependant, certaines choses se comportent différemment en fonction du choix du format de stockage, même si elles ne devraient pas l'être. En fonction du choix du format de stockage,
&
, |
y ^
) devinent si leurs opérandes sont des chaînes de caractères ou non.open
et d'autres buildins liés aux fichiers encodent le nom du fichier en utilisant UTF-8 ou non. (Bug !)Comme l'a déjà dit @ikegami, pas grand chose. Mais rappelez-vous qu'il y a BEAUCOUP de différence entre
$ perl -E '$v=0500; say $v'
imprime 320
(valeur décimale du nombre octal 0500), et
$ perl -E '$v="0500"; say $v'
quels imprimés
0500
y
$ perl -E '$v=0900; say $v'
ce qui meurt avec l'erreur :
Illegal octal digit '9' at -e line 1, at end of line
Execution of -e aborted due to compilation errors.
Y
perl -E '$v="0300";say $v+1'
imprime
301
mais
perl -E '$v="0300";say ++$v'
imprime
0301
similaire avec 0x\d+
par exemple
$v = 0x900;
$v = "0x900";
Pour fournir un peu plus de contexte sur les réponses "pas grand chose", voici une représentation des structures de données internes des deux valeurs via le module Devel::Peek :
user@foo ~ $ perl -MDevel::Peek -e 'print Dump 500; print Dump "500"'
SV = IV(0x7f8e8302c280) at 0x7f8e8302c288
REFCNT = 1
FLAGS = (PADTMP,IOK,READONLY,pIOK)
IV = 500
SV = PV(0x7f8e83004e98) at 0x7f8e8302c2d0
REFCNT = 1
FLAGS = (PADTMP,POK,READONLY,pPOK)
PV = 0x7f8e82c1b4e0 "500"\0
CUR = 3
LEN = 16
Voici un dump de Perl faisant ce que vous voulez dire :
user@foo ~ $ perl -MDevel::Peek -e 'print Dump ("500" + 1)'
SV = IV(0x7f88b202c268) at 0x7f88b202c270
REFCNT = 1
FLAGS = (PADTMP,IOK,READONLY,pIOK)
IV = 501
Le premier est un nombre (le nombre entier entre 499 et 501). Le second est une chaîne de caractères (les caractères '5', '0' et '0'). Il s'agit de pas vrai qu'il n'y a pas de différence entre eux. C'est pas vrai que l'un sera immédiatement converti en l'autre. C'est est vrai que les chaînes de caractères sont converties en nombres lorsque cela est nécessaire, et vice-versa, et que la conversion est en grande partie transparente, mais pas complètement.
La réponse Quand la différence entre une chaîne et un nombre est-elle importante en Perl 5 ? couvre certains des cas où ils sont pas équivalent :
$x = 1000000000000000
y $y = "1000000000000000"
alors $x pourrait se transformer en 1e+15
. Puisque l'utilisation d'une variable comme clé de hachage est une stringification, cela signifie que $hash{$x}
y $hash{$y}
peuvent être des tranches de hachage différentes.~~
) et les opérateurs given/when traitent les arguments numériques différemment des chaînes numériques. Il est préférable d'éviter ces opérateurs de toute façon. Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.