Понимание данных:: вывод дампа

Простой вопрос:

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. Я не знаю, как интерпретировать скобки вроде.

2 ответа

Решение

У вас есть ссылка на массив, где значения внутри массива являются ссылками хеша. Чтобы получить доступ к отдельным значениям, используйте оператор стрелки ->,

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

Или вы можете пройти через них.

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

Вы могли бы дажеsort их в алфавитном порядке по значениям ключей ref.

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

Смотрите perlref, perlreftut и perldsc для более подробной информации о структурах данных и ссылках.

Это называется массивом хэшей. Если $array содержит данные, то ниже будут работать:

[] является ссылкой на анонимный массив, в то время как {} является анонимной ссылкой на хеш Проверьте perlref,

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

Дальнейшее чтение:

  1. С помощью Arrow operator(->) - Наиболее подходит для доступа к одному элементу из arrayref или hashref.
  2. С помощью @ { } - Подходит для итерации по arrayrefs.

Редактировать:

Теперь после вашего редактирования становится ясно, что вы хотите что-то вроде этого:

for (@way_node_refs) {
    print $_ -> {ref},"\n";
}
Другие вопросы по тегам