当通过`for`循环时,数组保持数组

Tyi*_*yil 7 perl6

depends从一个循环遍历数组META6.json.我加载了一个Hash使用JSON::Fast.for但是,当我使用循环遍历它时,它只通过循环一次,并且该项是相同的数组:

use JSON::Fast;
my %meta = from-json(slurp("META6.json"));

for %meta<depends> -> $dependency {
    dd $dependency;
}
Run Code Online (Sandbox Code Playgroud)

这段代码返回

Array $dependency = $["Config::Parser::toml:ver<1.0.1+>", "Config:api<1>:ver<1.3.5+>", "Dist::Helper:ver<0.21.0+>", "Hash::Merge", "Terminal::Getpass:ver<0.0.5+>", "zef"]
Run Code Online (Sandbox Code Playgroud)

我希望它能循环%meta<depends>6次,每次迭代都会从该数组中获取不同的元素.

为了更好地衡量,这是dd %meta<depends>示例的输出:

Array %meta = $["Config::Parser::toml:ver<1.0.1+>", "Config:api<1>:ver<1.3.5+>", "Dist::Helper:ver<0.21.0+>", "Hash::Merge", "Terminal::Getpass:ver<0.0.5+>", "zef"]
Run Code Online (Sandbox Code Playgroud)

为什么循环不按我预期的方式循环?

编辑:我正在使用最新的Rakudo Star:

This is Rakudo Star version 2018.04.1 built on MoarVM version 2018.04.1
implementing Perl 6.c.
Run Code Online (Sandbox Code Playgroud)

Eli*_*sen 10

即使%meta<depends>包含一个Array,它也包含在一个项目(容器)中.该for声明着眼于此并决定迭代(容器)只有一件事.

这很容易解决:通过后缀.list将项目转换为某种东西Iterable,因此它将迭代Array在容器中:

for %meta<depends>.list -> $dependency {
Run Code Online (Sandbox Code Playgroud)

稍微短一点的语法是@():

for @(%meta<depends>) -> $dependency {
Run Code Online (Sandbox Code Playgroud)

编辑:或使用jjmerelo建议的语法,对该元素进行去包容,从而将基础暴露Arrayfor:

for %meta<depends><> -> $dependency {
Run Code Online (Sandbox Code Playgroud)


Sam*_* M. 7

这是一个陷阱.基本上这就像:

my $var = ['a', 'b', 'c'];
for $var -> $v {
    dd $v;
}
Run Code Online (Sandbox Code Playgroud)

哪个给你: $["a", "b", "c"]

如果使用@ sigil迭代一个数组,它已经充当了一个数组,但是当你在标量中有一个列表时,它将返回数组,而不是在它内部迭代.

解决方案是使用.list它作为列表而不是标量.