了解 Data::Dumper 输出

Understanding Data::Dumper output

简单问题:

use warnings;
use XML::Simple;
use Data::Dumper;

my $file='test.osm';

my $test_data = XMLin( $file ); 

print Dumper( $test_data ); 

my @way_node_refs=$test_data->{'way'}->{'nd'};

print Dumper( @way_node_refs ); 

print( @way_node_refs[1]->{'ref'} );ere

它有以下输出。没有给出第一个转储,因为它无关紧要。

$VAR1 = [
      {
        'ref' => '453966480'
      },
      {
        'ref' => '453966490'
      },
      {
        'ref' => '453966482'
      },
      {
        'ref' => '453966130'
      },
      {
        'ref' => '453966143'
      },
      {
        'ref' => '453966480'
      }
    ];

如何使用键 ref 访问值。我不知道如何解释大括号。

这称为散列数组。如果 $array 包含数据,则以下将起作用:

[]是匿名数组引用,而{}是匿名散列引用。检查 perlref.

for (@{ $array }) {
    print $_ -> {ref},"\n";
}

延伸阅读:

  1. 使用 Arrow operator(->) - 最适合从 arrayref 或 hashref 访问单个项目。
  2. 使用 @ { } - 适用于遍历数组引用。

编辑:

现在在你的编辑之后,很明显你想要这样的东西:

for (@way_node_refs) {
    print $_ -> {ref},"\n";
}

您有一个数组引用,其中数组内的值是散列引用。要访问单个值,请使用箭头运算符 ->.

 print $foo->[0]->{ref};
 print $foo->[1]->{ref};

或者您可以遍历它们。

foreach my $elem ( @{ $foo } ) {
    print Dumper $elem;
    print $elem->{ref};
}

could even sortref 键值的字母顺序排列它们。

my @sorted = sort { $a->{ref} cmp $b->{ref} } @$foo; # note @sorted is an array

有关数据结构和引用的更多详细信息,请参阅 perlref, perlreftut and perldsc