如何遍历 Raku 哈希中的数组?

How do I iterate through an array inside a Raku hash?

这似乎是一个简单的问题,但 Perl6/Raku 的表现并不像我预期的那样。我试图在哈希中创建对数组的引用,但没有得到预期的行为。在 Perl5 中,答案将涉及通过引用访问数组,但我没有看到 Perl6/Raku.

的等效语法
my $jsonstr = q:to/END/;
{
    "arr" : [
        "alpha","beta","delta","gamma"
    ]
}
END

my %json = from-json $jsonstr;
my @arr = %json{'arr'};
say "Arr length is " ~ @arr.elems; # Expect 4, get 1
say "Orig length is " ~ %json{'arr'}.elems; # Get expected value of 4
say "Arr[0] is " ~@arr[0].^name ~ " of length " ~ @arr[0].elems; # First index is array

say %json{'arr'}[0]; # Indexing into array in original location works as expected
say @arr[0][0]; # But when assigned, it needs an extra index

my @arr2 = @arr[0]; # Same issue in re-assignment here
say "Arr2[0]: " ~ @arr2[0] ~ ", length of " ~ @arr2.elems;

如何在没有这个令人困惑的额外 [0] 索引层的情况下获取新的 @arr 变量来引用嵌套数组?这是一个错误,还是我对 Raku Array/ref 处理的理解遗漏了什么?谢谢

像往常一样,在写完+发布我的问题后,我回答了我自己的问题。

my @arr = %json{'arr'}.Array;

我不太明白为什么这是必要的,但它提供了所需的行为。

当您将键 arr 中的值分配给数组 @arr 时,它会将 %json{'arr'} 中的值作为数组对象 ["alpha","beta","delta","gamma"] 并将其放入@arr 所以你得到一个包含 1 个项目的数组。

您有几个选择:

您可以使用 my @arr := %json{"arr"}

@arr 绑定到 %json{"arr"}

或者您可以将 %json{"arr"} 传递给具有 my (@arr) = %json{"arr"}

的列表

你必须记住在 Raku Array 中是对象。