Если я правильно понимаю ваш вопрос, то вы спрашиваете, как использовать хэши с 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 &, каждый из которых выдает более простой код:
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;
}
}
Также обратите внимание, что я удалил последний цикл в вышеприведенном примере, потому что в настоящее время он лишний с моими данными хэша примера.
NB. Если вы планируете изменить ключи или выйти из цикла, прочтите, пожалуйста, каждый и как это влияет на итерацию.
PS. Этот пример не о цикле, а о том, что данные лучше всего представлять в виде хэша, а не массива! (хотя это не ясно, 100% из вопроса, который так!).