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

时间:2018-07-11 09:35:54

标签: perl6

我正在从depends遍历META6.json数组。我已使用Hash加载到JSON::Fast中。但是,当我使用for循环遍历它时,它只经历一次循环,并且项目是同一数组:

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

for %meta<depends> -> $dependency {
    dd $dependency;
}

这段代码返回

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"]

我希望它可以遍历%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"]

为什么循环没有按照我期望的方式循环?

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

This is Rakudo Star version 2018.04.1 built on MoarVM version 2018.04.1
implementing Perl 6.c.

2 个答案:

答案 0 :(得分:10)

即使%meta<depends>包含一个Array,它也包含在一个项目(容器)内。 for语句对此进行了检查,并确定只有一件事要进行迭代(容器)。

这很容易解决:通过加后缀.list,您可以将项目转换为Iterable,从而可以遍历容器中的Array

for %meta<depends>.list -> $dependency {

@()的语法略短:

for @(%meta<depends>) -> $dependency {

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

for %meta<depends><> -> $dependency {

答案 1 :(得分:7)

这是一个陷阱。本质上是这样的:

my $var = ['a', 'b', 'c'];
for $var -> $v {
    dd $v;
}

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

如果使用@ sigil迭代数组,则该数组已充当数组,但是当您在标量中包含列表时,它将返回该数组,而不会在其中进行迭代。

解决方案是使用.list使其成为列表而不是标量。