2017-08-07 14 views
0

私はperlを使い慣れていません。私は次のコードの出力を理解できません。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 ++], " "; 
} 

出力はここに貼り付けられます:私はこのような私のコードを変更した場合

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

しかし、:

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 ++], " "; 
} 

出力は次のようになります。

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

私はこれらの試験の違いを理解することはできません特に最初のwhileループの変更が2番目のループに影響する理由は何ですか?誰かがなぜ出力が逆の順序であるのか教えてもらえますか?どうもありがとう。

+2

については

[印刷する際にハッシュキーが異なる順序を持っていないのはなぜ?](https://stackoverflow.com/questions/30340027/why-do-hash-keys-have-different-order -when-printing) – mkHun

+1

"問題"はあなたの '++'呼び出しではありません。それは完全に大丈夫です。しかし、 'keys%fruit_color;'という呼び出しは、任意の順序でハッシュのキーを返します。異なるスクリプト実行間で同じであることを頼ることはできません。 [docs](http://perldoc.perl.org/functions/keys.html)から:_ "ハッシュエントリは明らかにランダムな順序で返されます。" _ – PerlDuck

答えて

0

ほぼすべてのプログラミング言語には、同様の++演算子(および対応する--演算子)があります。プリインクリメントとポストインクリメントと呼ばれています。 ++$foo{ $foo += 1; return $foo; }のように機能しますが、++$fooはより興味深いバージョンです。すぐに$fooをインクリメントしますが、前の値を返します。これにより、変更の前後に値を取得するかどうかを指定できるため、簡単な計算のほうがはるかに短くなります。

4

問題が増えていません。問題はハッシュです。コンピュータのメモリでは、ハッシュは、あなたがより多くの時間よりもスクリプトを実行し、出力を監視する場合は、異なる出力を与える例

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

について、あなたが宣言したものと同じ順序で格納されていません。

ハッシュと配列はどちらも同じですが、キーを設定していても何らかの違いがあります(インデックスとして呼び出された配列で、キーとして呼び出されたハッシュ)。

任意の名前をキーとして使用して値を保存できます。しかし配列は、インデックス値だけでデータにアクセスすることができます。

インデックスの値でアクセスしているため、アイテムを配列に配置することは重要です。しかし、キーを設定しているので、アイテムをハッシュに配置する必要はありません。 infoよりperldoc

関連する問題