28 votes

Différence entre $var = 500 et $var = '500'.

En Perl, quelle est la différence entre

$status = 500;

y

$status = '500';

39voto

ikegami Points 133140

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,

  • JSON décide d'utiliser les guillemets ou non.
  • DBI devine le type SQL qu'il doit utiliser pour un paramètre.
  • Les opérateurs bit à bit ( & , | 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 !)
  • Certaines opérations mathématiques renvoient un zéro négatif ou non.

21voto

jm666 Points 17312

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";

19voto

ysth Points 54757

Il y a seulement une différence si vous utilisez ensuite $var avec l'un des rares opérateurs qui ont des saveurs différentes lorsqu'ils opèrent sur une chaîne de caractères ou un nombre :

$string = '500';
$number = 500;
print $string & '000', "\n";
print $number & '000', "\n";

sortie :

000
0

8voto

Nathan Day Points 276

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

6voto

hobbs Points 71946

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 :

  • Les opérateurs binaires traitent les nombres numériquement (en opérant sur les bits de la représentation binaire de chaque nombre), mais ils traitent les chaînes de caractères (en opérant sur les bits de chaque caractère de chaque chaîne).
  • Le module JSON affichera une chaîne de caractères comme une chaîne de caractères (avec des guillemets) même si elle est numérique, mais il affichera un nombre comme un nombre.
  • Un nombre très petit ou très grand peut être stringifié différemment de ce que vous attendez, alors qu'une chaîne est déjà une chaîne et n'a pas besoin d'être stringifiée. C'est-à-dire que si $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.
  • La correspondance intelligente ( ~~ ) 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.com

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.

Powered by:

X