如果我正确理解了您的问题,那么您会问如何将哈希与 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% 清楚的问题就是这样!)。