如何将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}
当然,这不是我想要的。
答案 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