2013-12-04 6 views
0

У меня есть файл журнала, который выглядит следующим образом.Создание хеша хэшей Perl

Year:2001 
State: A 
District A 
District B 
State: B 
District A 
District B 
Year:2002 
State: A 
District A 
District B 
State: B 
District A 
District B 
. 
. 
Year:2012 
State: A 
District A 
District B 
State: B 
District A 
District B 

Я хотел бы иметь хэш хэш таким образом, что:

$VAR2 = {'2001' => { 
       'state A' => { district a 
           district b 
           } 
        'state B' => { district a 
           district b 
           }     
        } 
     2002' => { 
       'state A' => { district a 
           district b 
           } 
        'state B' => { district a 
           district b 
           }     
        } 
}; 

Я попытался выше логики, используя 3 вложенных циклов следующим образом:

foreach my $key (keys %hash) { 
    foreach my $key2 (keys %{ $hash{$key} }) { 
     foreach my $key3 (keys %{ $hash{$key}{$key2} }) { 
     $value = $hash{$key}{$key2}->{$key3}; 
     } 
    } 
} 

Пожалуйста, может кто-нибудь объяснить, мне нужна процедура. Или, по крайней мере, сообщите мне, если я пойду на путь записи. Спасибо.

+1

Похоже, вы уже построили хэш хэшей, и теперь вы хотите, чтобы получить доступ ко всем элементам - что дело? – fugu

+0

@FlyingFrog Я пробовал вышеуказанный путь в соответствии с логикой, но он не работает – deep

+0

'$ value = $ hash {$ key} {$ key2} -> {$ key3};' или '$ hash -> {$ key} -> {$ key2} -> {$ key3} = $ value; '? Может быть, это опечатка? –

ответ

1

Вы могли бы сделать что-то вроде:

use strict; 
use warnings; 
use 5.010; 
use Data::Dumper; 

my $hash; 
my $year; 
my $state; 
while(<DATA>) { 
    chomp; 
    if(/^Year:(\d+)/) { 
     $year = $1; 
     $hash->{$year} = {}; 
     next; 
    } elsif (/^State:/) { 
     $state = $_; 
     $hash->{$year}{$state} = []; 
     next; 
    } elsif(/^District/) { 
     push @{$hash->{$year}{$state}}, $_; 
    } 
} 
say Dumper$hash; 


__DATA__ 
Year:2001 
State: A 
District A 
District B 
State: B 
District A 
District B 
Year:2002 
State: A 
District A 
District B 
State: B 
District A 
District B 
Year:2012 
State: A 
District A 
District B 
State: B 
District A 
District B 

выход:

$VAR1 = { 
      '2002' => { 
        'State: B' => [ 
            'District A', 
            'District B' 
           ], 
        'State: A' => [ 
            'District A', 
            'District B' 
           ] 
        }, 
      '2001' => { 
        'State: B' => [ 
            'District A', 
            'District B' 
           ], 
        'State: A' => [ 
            'District A ', 
            'District B' 
           ] 
        }, 
      '2012' => { 
        'State: B' => [ 
            'District A', 
            'District B' 
           ], 
        'State: A' => [ 
            'District A ', 
            'District B' 
           ] 
        } 
     }; 
+0

Почему в приведенном выше примере используется $ hash вместо% hash? – deep

+0

@deep: Нет никакой конкретной причины, вы можете использовать хеш. – Toto

Смежные вопросы