如何在 Perl 6 中制作哈希数组?

How to make an array of hashes in Perl 6?

如何使已被推入arrayhash独立于"source"hash

my %country;
my Hash @array;

%country{ 'country' } = 'France';
@array.push(%country);
%country{ 'country' } = 'Germany';
@array.push(%country);

.say for @array;

输出为:

{country => Germany}
{country => Germany}

当然这不是我想要的。

几乎所有编程语言都有这个问题。您不止一次将相同的哈希值推送到数组中。当您更改散列时,您更改了数组内的两个引用。

如果将不同的哈希值压入数组,您将看到预期的结果:

my %a = ( country => 'China' );
my %b = ( country => 'USA' );
my Hash @array;
@array.push(%a);
@array.push(%b);
say @array.perl;

您甚至可以在将散列推送到数组时复制散列,而不是声明两个散列。这也将解决这个问题:

my %country;
my @array;
%country<country> = 'México';
@array.push(%country.list.hash);
%country<country> = 'Canada';
@array.push(%country.list.hash);
say @array.perl;

顺便说一句,复制散列的方法有很多种。关键是获取 key/values,然后将其转回哈希。使用哪种哈希构造函数以及使用哪种展平方法由您决定。 (.kv.list.pairs.flat 都是 Hash 方法,它们将以一种或另一种方式顺序获取元素。Håkon 展示的方式是更隐含,获取元素然后单独通过语法创建另一个散列。)

当您将散列 %country 推送到数组时,您将引用推送到 %country。这样,每个数组元素都会引用同一个原始散列%country。当您更改哈希的值时,所有数组元素都将反映此更改(因为它们都引用相同的哈希)。如果你想在每次推送时都创建一个新的哈希,你可以尝试推送一个匿名哈希。例如:

%country{ 'country' } = 'France';
@array.push({%country});
%country{ 'country' } = 'Germany';
@array.push({%country});

这样,每次都会推送对 %country 副本的引用(而不是对 %country 的引用)。

输出:

{country => France}
{country => Germany}

如果您只想要一个简单的键值对(而不是多部分散列),请考虑 Pairs?

my Pair @array;
@array.push( (:country<Germany>) );
@array.push( (country => "France") );
say @array;
say .kv for @array