Я полностью застрял в проблеме:
У меня есть несколько огромных Perl-скриптов с несколькими огромными многоуровневыми хэш-таблицами. Все работает нормально, но для уменьшения кода и читабельности я хотел бы передать последнюю ссылку на хэш подфункции.
Как упоминалось ранее, у меня есть несколько разных хэш-таблиц, например. %hash_table1 и %hash_table2 имеют одинаковые значения, но разные уровни ключей.
hash_table1 с 3 уровнями ключей:
$hash_table1{$key1}{$key2}{$key3}->{value1}
$hash_table1{$key1}{$key2}{$key3}->{value2}
$hash_table1{$key1}{$key2}{$key3}->{value3}
У меня есть те же «значения» в другой хеш_таблице, но с другим многоуровневым: хэш_таблица2 с 2 уровнями ключей:
$hash_table2{$key1}{$key2}->{value1}
$hash_table2{$key1}{$key2}->{value2}
$hash_table2{$key1}{$key2}->{value3}
Я могу легко получить доступ ко всем значениям по отдельности, просто скопировав весь код, изменив количество ключей в нем, но большую часть времени у меня есть около 20 разных значений, поэтому... количество кода для доступа к данным.. ну... огромный. Кроме того, если что-то нужно изменить, мне придется изменить это несколько раз ;(
то, что я хотел бы иметь, это что-то вроде следующей подфункции, где я в основном просто сохраняю последнюю ссылку на хеш-ключ во временной хэш-таблице, чтобы легко получить доступ ко всем значениям разных хэш-таблиц таким же образом (это часть, которая не является работающий!!!):
sub print_all_values {
my %hash_tmp = shift @_;
printf $hash_tmp->{value1}.";";
printf $hash_tmp->{value2}.";";
printf $hash_tmp->{value3}."\n";
}
и где-то в коде я обрабатываю многоуровневую обработку и просто передаю последнюю ссылку на предыдущую определенную подфункцию, чтобы сделать ... ну, что нужно делать там с сохраненными значениями (скажем, просто печать):
foreach my $k1 (sort {$a <=> $b} keys %hash_table1){
foreach my $k2 (sort {$a <=> $b} keys %{$hash_table1{$k1}}){
foreach my $k3 (sort {$a <=> $b} keys %{$hash_table1{$k1}{$k2}}
print_all_values(%{$hash_table1{$k1}{$k2}{$k3}});
}
}
}
закончите где-нибудь еще код для доступа к двухуровневой хеш-таблице:
foreach my $k1 (sort {$a <=> $b} keys %hash_table2){
foreach my $k2 (sort {$a <=> $b} keys %{$hash_table2{$k1}}){
print_all_values(%{$hash_table2{$k1}{$k2}});
}
}
Как упоминалось ранее, было бы просто неплохо иметь работающее решение для передачи последней ссылки на хэш подфункции для одновременного доступа ко всем сохраненным значениям.
Заранее большое спасибо за любой полезный комментарий,
всего наилучшего,
OldMcFunsy
%hash_tmp
и$hash_tmp->{key}
не относятся к одному и тому же хешу! - person mob   schedule 16.07.2013