Хэш хешей массивов
Допустим в информации есть двойная степень вложенности, т.е. допустим 20 строк air и в этих 20 строках есть подкатегории по номерам, т.е. 20 строк состоят из трехподгрупп air,mumbra, air,kukumbra и air,telepuzikoff(on):
air,Acmar,one
air,Acmar,two
air,Airwell,one
air,Airwell,two
air,Ariston,one
air,Ariston,two
air,Ariston,three
air,Ariston,four
air,Mumbra,one
air,Mumbra,two
fridg,Ardor,one
fridg,Ardor,two
fridg,Ardor,three
fridg,Ardo-Young,one
fridg,Ardo-Young,two
fridg,Ardo-Young,three
wei,Tefal,one
wei,Tefal,two
wei,Tefal,three
Структурировать такую информацию можно при помощи гибрида хеша хешей и хеша массивов, т.е. хеша хешей массивов:
#!/usr/bin/perl
open F, "<example" or die "can open: $!\n"; @mass=<F>; close F;
for $gr(grep{!$_{$_}++} map{/^(.*?),/} @mass){
for $line(@mass){push @{$hash{$gr}{$1}}, $2 if $line=~m!^$gr,(.*?),(.*)!}
}
print "name hash\tkeys\t\tmassives\n\n";
for $a(sort keys %hash){
print "hash $a: \n\t{\n\t";
for $key(sort keys %{$hash{$a}}){
print "'$key' \t => [ ";
print join " | " => @{$hash{$a}{$key}};
print " ]\n\t";
}
print "}\n";
}
на выходе такая программа выдаст:
name hash keys massives
hash air:
{
'Acmar' => [ one | two ]
'Airwell' => [ one | two ]
'Ariston' => [ one | two | three | four ]
'Mumbra' => [ one | two ]
}
hash fridg:
{
'Ardo-Young' => [ one | two | three ]
'Ardor' => [ one | two | three ]
}
hash wei:
{
'Tefal' => [ one | two | three ]
}
Доступ к определенному элементу массива можно получить, указывая явно набор ключей ${$hash{$a}{$key}}[$n], где $n < $#{$hash{$a}{$key}}