Как перебирать части этой сложной структуры данных? - PullRequest
1 голос
/ 23 ноября 2011

У меня есть объект, который я напечатал с помощью Data :: Dumper :

$VAR1 = {
          'record' => [
                      {
                        'text' => 'booting kernel',
                        'version' => '2',
                        'iso8601' => '2011-06-23 11:57:14.250 +02:00',
                        'event' => 'system booted',
                        'modifier' => 'na'
                      },
                      {
                        'text' => 'successful login',
                        'subject' => {
                                     'sid' => '999',
                                     'uid' => 'user',
                                     'audit-uid' => 'user',
                                     'tid' => '0 0 unknown',
                                     'ruid' => 'user',
                                     'rgid' => 'gsp',
                                     'pid' => '999',
                                     'gid' => 'gsp'
                                   },
                        'version' => '2',
                        'iso8601' => '2011-06-23 11:58:00.151 +02:00',
                        'event' => 'login - local',
                        'return' => {
                                    'retval' => '0',
                                    'errval' => 'success'
                                  },
                        'host' => 'unknown'
                      },
                    ],
          'file' => {
                    'iso8601' => '2011-06-23 11:57:40.064 +02:00'
                  }
        };

Я хочу напечатать каждое значение, перемещаясь по такому хэшу.Что я понял, так это хеш с двумя ключами (запись, файл) и запись указывает на массив хешей.

Не могли бы вы помочь достичь каждого значения этой структуры?

Я пытался:

my @array=$VAR1{'record'};
foreach (@array) {
    print $_{'text'};    
}

… но это не работает.

Ответы [ 4 ]

3 голосов
/ 24 ноября 2011

Если вы просто хотите перебрать его, вы можете сделать что-то вроде этого:

iterate($VAR1);

sub iterate {
    my $input = shift;
    unless (ref $input) {
        print "$input\n";
    } elsif (ref $input eq 'ARRAY') {
        iterate($_) for @$input;
    } elsif (ref $input eq 'HASH') {
        for (keys %$input) {
            print "$_\n";
            iterate($input->{$_});
        }
    } else {
        print ref $input,"\n";
    }
}

Это не совсем красиво печатать, как это делает Data :: Dumper, но метод может быть полезен, если вы хотите сделать что-то еще с произвольной вложенной структурой, о которой вы не очень много знаете.

1 голос
/ 23 ноября 2011

$VAR1{record} - это ссылка на массив, а не массив.Чтобы добраться до массива, вам необходимо разыменовать:

my @array = @{ $VAR1->{record} };

Каждый элемент в массиве является ссылкой на хеш, поэтому:

for my $record ( @array ) {
    print $record->{text};
}
0 голосов
/ 24 ноября 2011

Попробуйте:

foreach my $record_ref ( @{ $VAR1->{record} } ) {
    print "$record_ref->{text}\n";
}

Здесь эти переменные разыменовываются:

$VAR1 - hash ref,
$VAR1->{record} - array ref,
$record_ref - hash ref.

Добавьте это в свой код, чтобы перехватить очевидные ссылочные ошибки:

use warnings;
use strict;

Используйте print с Data :: Dumper для любой переменной, которую вы хотите проверить (например, $ record_ref), для диагностики.

0 голосов
/ 23 ноября 2011

$VAR1 является ссылкой. Вы должны разыменовать это. $VAR1->{record} является ссылкой. Вы должны разыменовать это тоже. $_ также является ссылкой, поэтому вам нужно разыменовать это.

perldoc perlreftut

my @array = @{ $VAR1->{'record'} };
foreach (@array) { 
    print $_->{'text'}; 
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...