代码之家  ›  专栏  ›  技术社区  ›  BioRod

我不能用Perl打印键和值

  •  0
  • BioRod  · 技术社区  · 2 年前

    我从这段代码中得到了一个数据结构。

    my $name = $data->{Instances}->[0]->{Tags};
    

    数据结构如下所示

    $VAR1 = [
          {
            'Key' => 'Name',
            'Value' => 'fl-demo'
          },
          {
            'Value' => 'FL',
            'Key' => 'state'
          }
        ];
    

    foreach my $key (sort keys %$name) {
    my $value = $name->{$key};
    print "$key  => $value\n";
    }
    

    我正在

    Not a HASH reference at ./x.pl line 19.
    
    1 回复  |  直到 2 年前
        1
  •  1
  •   ikegami Gilles Quénot    2 年前

    标记作为数组而不是散列返回。因此,您正在考虑这样做,而是迭代它们:

    foreach my $tag (@$name) {
        my $key = $tag->{Key};
        my $val = $tag->{Value};
        print "$key => $val\n";
    }
    
        2
  •  1
  •   ahi324    2 年前

    • $name 是对包含哈希引用的数组的引用。
    • @$name @{$name} (等效表示) $名称 参考文献。
    • ${$name}[0] $name->[0] .
    • ${$name}[0]{'Key'} , $name->[0]->{'Key'} (等效表示) 'Key'

    因此,以下内容将迭代所有数组和哈希元素:

    foreach my $hashref ( @{$name} )
    {
        foreach my $key ( sort(keys(%{$hashref})) )
        {
            printf("%s => %s\n",$key,$hashref->{$key});
        }
        print "\n";
    }
    

    ,更简洁(而且可以说是不可理解的):

    printf("%s\n",join("\n", map {
        my $h = $_;
        join(', ', map { sprintf('%s=%s',$_,$h->{$_}) } sort(keys(%{$h})) );
    } @{$name} ));
    
        3
  •  0
  •   Polar Bear    2 年前

    变量的数据结构转储 $name

    您可以使用循环输出感兴趣的数据,不要忘记取消引用 $名称

    use strict;
    use warnings;
    use feature 'say';
    
    my $name = [
            {
                'Key' => 'Name',
                'Value' => 'fl-demo'
            },
            {
                'Value' => 'FL',
                'Key' => 'state'
            }
        ];
        
    
    say "$_->{Key} = $_->{Value}" for @$name;
    

    输出

    Name = fl-demo
    state = FL