我无法在Perl中打印键和值

6za6bjd0  于 2022-11-15  发布在  Perl
关注(0)|答案(3)|浏览(190)

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

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.
uwopmtnx

uwopmtnx1#

标签以数组的形式返回,而不是散列。因此,您需要执行类似下面的操作,以迭代它们:

foreach my $tag (@$name) {
    my $key = $tag->{Key};
    my $val = $tag->{Value};
    print "$key => $val\n";
}
b4qexyjb

b4qexyjb2#

变量$name的数据结构转储表明您有数组引用。
您可以使用循环输出感兴趣的数据,不要忘记取消引用$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
tv6aics1

tv6aics13#

详细说明之前的答案:

  • $name是对包含哈希引用的数组的引用。
  • @$name * 和 * @{$name}(对等表示法) 指涉$name所指涉的数组。
  • ${$name}[0] * 和 * $name->[0](等效表示) 引用由$name引用的数组中的第一个散列。
  • ${$name}[0]{'Key'}$name->[0]->{'Key'}(等价表示) 指的是$name所引用的数组中的第一散列中的'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} ));

相关问题