在 Perl 6 中使用数组值从散列中检索数据
Retrieving data from a hash with array values in Perl 6
我有一个包含 3 个元素的数组:
my @a = <x y z>;
然后我用 Array
个值进行散列,并将 @a
的内容作为其值之一:
my Array %h;
%h<a> = @a;
稍后我检索此值并将其分配给另一个数组:
my @A = %h<a>;
但是我在@A
中得到的不是3个元素的数组,而是一个元素的数组,它本身就是3个元素的数组:
say @A; # [[x y z]]
say @A[0].elems; # 3
因此,%h<a>
被 push
编辑为 @A
。
我的代码哪里出错了?
UPD: 这似乎解决了问题,但并没有提高我的理解。 :)
my @A = @(%h<a>);
say @A; [x y z]
发生这种情况的原因是数组 @a
必须放入容器中才能作为值存储在 Hash
中。并且容器内的东西在存储到数组@A
时将保留在容器中。因此,您需要的是在分配给 @A
时摆脱容器。您的解决方案是摆脱容器的一种方法,但这会创建一个中间体 List
,这对于大型阵列来说可能会变得昂贵。
正如我所说,您需要摆脱容器。幸运的是,我们有一个语法:postfix <>
:
my @a = <a b c>;
my %h = a => @a;
my @b = %h<a><>; # <-- note the <> here
dd @b; # Array @b = ["a", "b", "c"]
如果您确实希望 @b
可变,这将是最有效的方法。或者,如果您希望 @b
只是原始 @a
的别名,您还可以绑定:
my @a = <a b c>;
my %h = a => @a;
my @b := %h<a>; # <-- note the := here
dd @b; # Array @a = ["a", "b", "c"]
请注意 dd
输出现在显示 @a
作为名称,因为它现在实际上与 @a
相同:对 @a
的任何更改现在也会显示在 @b
中,反之亦然。如果您无论如何都不更改它们,那也没关系。如果您的情况确实如此,那么这将是最有效的方法,无论是 CPU 明智还是内存明智。
我有一个包含 3 个元素的数组:
my @a = <x y z>;
然后我用 Array
个值进行散列,并将 @a
的内容作为其值之一:
my Array %h;
%h<a> = @a;
稍后我检索此值并将其分配给另一个数组:
my @A = %h<a>;
但是我在@A
中得到的不是3个元素的数组,而是一个元素的数组,它本身就是3个元素的数组:
say @A; # [[x y z]]
say @A[0].elems; # 3
因此,%h<a>
被 push
编辑为 @A
。
我的代码哪里出错了?
UPD: 这似乎解决了问题,但并没有提高我的理解。 :)
my @A = @(%h<a>);
say @A; [x y z]
发生这种情况的原因是数组 @a
必须放入容器中才能作为值存储在 Hash
中。并且容器内的东西在存储到数组@A
时将保留在容器中。因此,您需要的是在分配给 @A
时摆脱容器。您的解决方案是摆脱容器的一种方法,但这会创建一个中间体 List
,这对于大型阵列来说可能会变得昂贵。
正如我所说,您需要摆脱容器。幸运的是,我们有一个语法:postfix <>
:
my @a = <a b c>;
my %h = a => @a;
my @b = %h<a><>; # <-- note the <> here
dd @b; # Array @b = ["a", "b", "c"]
如果您确实希望 @b
可变,这将是最有效的方法。或者,如果您希望 @b
只是原始 @a
的别名,您还可以绑定:
my @a = <a b c>;
my %h = a => @a;
my @b := %h<a>; # <-- note the := here
dd @b; # Array @a = ["a", "b", "c"]
请注意 dd
输出现在显示 @a
作为名称,因为它现在实际上与 @a
相同:对 @a
的任何更改现在也会显示在 @b
中,反之亦然。如果您无论如何都不更改它们,那也没关系。如果您的情况确实如此,那么这将是最有效的方法,无论是 CPU 明智还是内存明智。