Понимание данных:: вывод дампа
Простой вопрос:
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";
}
Дальнейшее чтение:
- С помощью
Arrow operator(->)
- Наиболее подходит для доступа к одному элементу из arrayref или hashref. - С помощью
@ { }
- Подходит для итерации по arrayrefs.
Редактировать:
Теперь после вашего редактирования становится ясно, что вы хотите что-то вроде этого:
for (@way_node_refs) {
print $_ -> {ref},"\n";
}