如何在Perl 6中创建一个哈希数组?

时间:2017-11-03 13:42:56

标签: perl6

如何将hash推入array独立于"来源" 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}

当然,这不是我想要的。

3 个答案:

答案 0 :(得分:3)

几乎每种编程语言都有这个问题。您不止一次将相同的哈希值推送到阵列上。更改哈希值时,可以更改数组内的两个引用。

如果将不同的哈希值推送到数组上,您将看到预期的结果:

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;

顺便说一句,有很多方法可以复制哈希。关键是获取键/值,然后将其转换为哈希值。您使用哪种哈希构造函数和哪种展平方法取决于您。 (.kv.list.pairs.flat都是Hash方法,它们会以某种方式顺序获取元素.Håkon显示的方式是更隐式,获取元素然后仅通过语法创建另一个哈希。)

答案 1 :(得分:3)

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

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

通过这种方式,每次都会推送对%country副本的引用(而不是对%country的引用)。

<强>输出

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

答案 2 :(得分:1)

如果您只想要一个简单的键值对(不是多部分哈希),请考虑对吗?

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