0

简单的问题:

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 访问值。我不知道如何解释大括号。

4

2 回答 2

3

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

[]是匿名数组引用,{}而是匿名哈希引用。检查perlref

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

进一步阅读:

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

编辑:

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

for (@way_node_refs) {
    print $_ -> {ref},"\n";
}
于 2016-08-16T09:59:36.523 回答
2

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

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

或者你可以遍历它们。

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

甚至可以通过sortref键的值按字母顺序排列它们。

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

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

于 2016-08-16T10:03:56.940 回答