在Perl中循环遍历JSON结构

时间:2018-09-21 13:57:32

标签: json perl

如何用JSON数据填充列表?

这是我的代码:

my $groups = get_groups($t);
my @group;
my $i = 0;
do {
    push(@group, {
        groups  => [
            { type => $groups->{groups}->[$i]->{type} , group => $groups->{groups}->[$i]->{group} },
        ]
    });
    $i++;
} while ($i < length $groups->{groups});

这是json示例:

{
    "error":false,
    "message":"success",
    "group":[
        {"type":1,"group":"group1"},
        {"type":2,"group":"group2"},
        {"type":3,"group":"group3"},
        {"type":4,"group":"group4"},
        {"type":5,"group":"group5"}
    ]
}

函数get_groups($t);将返回json以上。我想获取数组group并将其放入列表groups。但是我得到了:

  

在使用“严格引用”时,不能将字符串(“ 0”)用作HASH引用

1 个答案:

答案 0 :(得分:2)

来自the documentation of length

  

以字符为单位返回EXPR值的长度。如果EXPR是   省略,返回$ _的长度。如果未定义EXPR,则返回   undef。

     

不能在整个数组或哈希上使用此函数来查找   这些有多少个元素。为此,请使用标量@array和标量   分别为%hash键。

要获取数组引用中的元素数,您需要取消引用并将其放入 scalar 上下文中。

my $foo = [ qw/a b c/ ];
my $number_of_elements = scalar @{ $foo }; # 3

您真正想要做的是遍历teams数组中的每个团队。无需获取元素数量。

my @teams;
foreach my $team ( @{ $opsteams->{teams} } ) {
    push @teams, {
        type => $team->{type},
        team => $team->{team},
    };
}

您的代码中还有一些额外的深度层。我不确定它们是干什么的。实际上,您似乎只想要@teams中的团队,

my @teams = @{ $opsteams->{teams} };