2011-11-23 52 views
1

我有一個對象,我印有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'};  
} 

...但它不工作。

+0

如果你不知道該結構的深度使用遞歸...遞歸到它,每次檢查與ref如果你有一個哈希或ARRAY參考 – snoofkin

回答

0

$VAR1是一個參考。你需要解除引用。 $VAR1->{record}是一個參考。您也需要解除引用。 $_也是一個參考,所以你需要解除引用。

perldoc perlreftut

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

$VAR1{record}是數組引用,而不是數組。要到陣列,則需要取消引用:

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

陣列中的每個元素都是一個散列引用,因此:

for my $record (@array) { 
    print $record->{text}; 
} 
+1

我認爲你的意思是'$ VAR1 - > {記錄}'。 '$ VAR1 {record}'是散列'%VAR1'的元素。 – flesk

+0

@flesk:你是對的;我的錯字;糾正。 – pavel

0

嘗試:

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; 

使用Data :: Dumper打印任何要檢查的變量(例如$ record_ref)以進行診斷。

+0

如果您不想使用Data :: Dumper,則通過調試器運行程序並使用'x'命令檢查數據結構將執行相同的操作。 –

2

如果你只是想遍歷它,你可以做這樣的事情:

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"; 
    } 
} 

這不正是漂亮打印像數據::自卸車做,但該技術可能是,如果你有用想用別人不瞭解的任意嵌套結構來做其他事情。