ほとんどすべてのプログラミング言語にこの問題があります。あなたは同じハッシュを複数回配列に押し込んでいます。ハッシュを変更すると、配列内の両方の参照が変更されます。
あなたがアレイ上に異なるハッシュをプッシュする場合は、あなたが期待する結果表示されます:
my %a = (country => 'China');
my %b = (country => 'USA');
my Hash @array;
@array.push(%a);
@array.push(%b);
say @array.perl;
あなたの代わりに2つのハッシュを宣言する、アレイ上にそれを押すと、あなたも、ハッシュをコピーすることができます。これはまたこの問題を解決します:
my %country;
my @array;
%country<country> = 'México';
@array.push(%country.list.hash);
%country<country> = 'Canada';
@array.push(%country.list.hash);
say @array.perl;
ところで、ハッシュをコピーする方法はたくさんあります。キーは、キー/値を取得し、それをハッシュに戻すことです。どのハッシュコンストラクタ、どの平坦化メソッドを使用するかはあなた次第です。 (.kv
、.list
、.pairs
、.flat
が何らかの形で、順次要素を取得するすべてのHash
メソッドです。ホーコンが示した方法は、その後一人で構文で別のハッシュを作成する要素を取得し、より暗黙的である。)
ありがとう!私はこの問題をローカライズするのに多くの時間を費やし、現在は '{'と '}'を挿入した後、プログラム全体が期待どおりに動作します。 :)私の質問は、なぜハッシュを押しているときに問題が起こるのですが、スカラー変数を押すときには起こりません。 'my $ x = 1; 私の@values; @ values.push($ x); $ x = 2; @valuesの場合は となります。 #1' –
@EugeneBarskyスカラーは値でプッシュされますが、ハッシュは参照によってプッシュされると思います。だから違いがあります:) –
また、[ルーチンプッシュのドキュメント](https://docs.perl6.org/routine/push)によると、* "pushは引数リストを平坦化しようとしません。または押しつけるものとしてリストすると、それは1つの追加要素になります」* –