2017-08-07 3 views
0

Je suis nouveau chez perl. Je ne peux pas comprendre la sortie des codes suivants.le comportement de l'opérateur '++' en perl

my %fruit_color = (apple => "red", banana => "yellow", grape => "purple"); 

my @fruits = keys %fruit_color; 
my @colors = values %fruit_color; 

print "The color of apple is ", $fruit_color{"apple"}, "\n"; 

$cnt = 0; 
while ($cnt < @fruits) { 
    print $fruits[$cnt ++], " "; 
} 
print "\n"; 
$cnt = 0; 
while ($cnt < @colors) { 
    print $colors[$cnt ++], " "; 
} 

La sortie est collé ici:

The color of apple is red 
grape banana apple 
purple yellow red 

Cependant, si je l'ai changé mon code comme ceci:

my %fruit_color = (apple => "red", banana => "yellow", grape => "purple"); 

my @fruits = keys %fruit_color; 
my @colors = values %fruit_color; 

print "The color of apple is ", $fruit_color{"apple"}, "\n"; 

$cnt = 0; 
while ($cnt < @fruits) { 
    print $fruits[$cnt], " "; # DIFF HERE ! 
    $cnt ++; 
} 
print "\n"; 
$cnt = 0; 
while ($cnt < @colors) { 
    print $colors[$cnt ++], " "; 
} 

La sortie sera:

The color of apple is red 
apple grape banana 
red purple yellow 

I ne peut pas comprendre la différence entre ces examens ples, surtout pourquoi le changement de la première boucle affectera la seconde. Quelqu'un pourrait-il me dire pourquoi la sortie est dans un ordre inverse? Merci beaucoup.

+2

[Pourquoi les clés de hachage ont un ordre différent lors de l'impression?] (Https://stackoverflow.com/questions/30340027/why-do-hash-keys-have-different-order -when-printing) – mkHun

+1

Le "problème" n'est pas votre appel "++". C'est parfaitement ok. Mais l'appel 'keys% fruit_color;' renvoie les clés du hachage dans un ordre arbitraire et vous ne pouvez pas compter sur lui pour être le même entre différentes exécutions de script. De la [docs] (http://perldoc.perl.org/functions/keys.html): _ "Les entrées de hachage sont retournées dans un ordre apparemment aléatoire." _ – PerlDuck

Répondre

0

Presque tous les langages de programmation ont un opérateur ++ similaire (et un opérateur -- correspondant). C'est ce qu'on appelle le pré-incrément et le post-incrément. ++$foo fonctionne comme { $foo += 1; return $foo; }, mais ++$foo est la version la plus intéressante. Il incrémente $foo immédiatement, mais renvoie la valeur précédente. Cela rend beaucoup plus simple l'écriture de beaucoup de mathématiques simples, car vous pouvez spécifier si vous voulez obtenir la valeur avant ou après la modification.

4

Le problème n'est pas dans votre incrément. Le problème est dans les hachages. En mémoire de l'ordinateur, hash ne sont pas stockés dans même ordre ce que vous avez déclaré, par exemple

my @fruits = keys %fruit_color; 
print @fruits; 

Si vous exécutez le script plus d'un temps et de surveiller la sortie, il donnera les différentes sorties. Les hachages et les tableaux sont tous les deux identiques mais ont une certaine différence, c'est-à-dire la définition de la clé (dans le tableau que nous avons appelé index, dans les hachés que nous avons appelé la clé).

Quel que soit le nom que vous voulez, vous pouvez le mettre comme clé et stocker la valeur. Mais tableau vous pouvez accéder aux données uniquement par la valeur de l'index. Ainsi, organiser un élément dans un tableau est important car vous accédez à sa valeur d'index. Mais il n'est pas nécessaire d'organiser l'élément dans les hachages parce que vous avez défini la clé.

Pour plus info et perldoc