あなたの質問を正しく理解していれば、配列の例で発生する不一致を回避するために foreach でハッシュを使用する方法を尋ねていますか?.
もしそうなら、ここに一例があります:
use strict;
use warnings;
my %sites = (
a => {
A => {
data_type => [ 'X', 'Y' ],
}
},
b => {
B => {
data_type => [ 'Y', 'Z' ],
}
},
c => {
},
);
for my $site ( keys %sites ) {
for my $server ( keys %{ $sites{ $site } } ) {
for my $data ( keys %{ $sites{ $site }{ $server } } ) {
my @data_types = @{ $sites{ $site }{ $server }{ data_type } };
say "On site $site is server $server with $data @data_types";
}
}
}
while & each を使用すると、目に見えるコードがより簡単になります。
while ( my ( $site, $site_info ) = each %sites ) {
while ( my ( $server, $server_info ) = each %{ $site_info } ) {
my @data_types = @{ $server_info->{data_type} };
say "On site $site we have server $server with data types @data_types"
if @data_types;
}
}
また、上記の例の最後のループを削除したことに注意してください。これは、現在、私の例のハッシュ データでは不要であるためです。
注意。キーを修正したり、ループから抜け出す予定がある場合は、それぞれを読んで、それが反復にどのように影響するかを確認してください。
PS。この例はループに関するものではなく、配列ではなくハッシュとして表現するのが最適なデータに関するものです! (質問から100%そうであるとは言えませんが!)。