私は完全に問題に固執しています:
いくつかの巨大なマルチレベル hash_tables を持ついくつかの巨大な perl スクリプトがあります。すべて正常に動作しますが、コードと読みやすさを減らすために、最後のハッシュ参照をサブ関数に渡したいと思います。
前述のように、%hash_table1 と %hash_table2 など、いくつかの異なるハッシュ テーブルがあり、どちらも同じ値ですが、キーのレベルが異なります。
3 レベルのキーを持つ hash_table1:
$hash_table1{$key1}{$key2}{$key3}->{value1}
$hash_table1{$key1}{$key2}{$key3}->{value2}
$hash_table1{$key1}{$key2}{$key3}->{value3}
他の hash_table にも同じ「値」がありますが、マルチレベルが異なります: 2 レベルのキーを持つ hash_table2:
$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}});
}
}
}
2 レベルの hash_table にアクセスするコードを別の場所で終了します。
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}});
}
}
前述のように、基本的にすべての保存された値に一度にアクセスするために、最後のハッシュ参照をサブ関数に渡す実用的なソリューションがあればいいのにと思います。
有益なコメントをお寄せいただきありがとうございます。
ではごきげんよう、
オールドマクファンジー