Perl编程:如何访问并循环遍历哈希中的数组
嘿,刚入门Perl遇到嵌套哈希+数组的遍历问题很正常,我来帮你拆解清楚这个结构怎么操作~
遍历嵌套哈希中的数组元素
首先咱们先理清楚你的%config结构:
- 最外层是哈希
%config,其中'repos'键对应另一个嵌套哈希 - 这个嵌套哈希里的每个键(比如
'duosecurity'、'RHEL-77-x86_64')又对应一个包名数组
要遍历所有数组里的元素,咱们可以分两层循环来实现,下面是具体的代码和解释:
完整代码示例
my %config = ( 'repos' => { 'duosecurity' => [ 'duo_unix.x86_64', ], #'puppet' => [ # 'puppet-agent', #], 'RHEL-77-x86_64' => [ 'perl-Data-Random.noarch', ] } ); # 第一步:取出repos对应的嵌套哈希引用 my $repo_hash = $config{'repos'}; # 第二步:遍历每个仓库的名称和对应的包数组 foreach my $repo_name (keys %$repo_hash) { print "当前仓库:*$repo_name*\n"; # 取出当前仓库对应的包数组引用 my $pkg_array = $repo_hash->{$repo_name}; # 第三步:遍历数组里的每个包名 foreach my $package (@$pkg_array) { print " - 包名:`$package`\n"; } }
代码逐行解释
- 获取嵌套哈希:
$repo_hash = $config{'repos'}拿到repos对应的哈希引用,Perl里嵌套的哈希/数组都是用引用传递的,所以要用%$repo_hash解引用成普通哈希来遍历。 - 遍历仓库名称:
keys %$repo_hash会返回所有仓库的名称,我们逐个处理每个仓库。 - 遍历包数组:
@$pkg_array把数组引用解引用成普通数组,然后用foreach循环逐个取出包名。
运行结果
执行这段代码后会输出:
当前仓库:*duosecurity* - 包名:`duo_unix.x86_64` 当前仓库:*RHEL-77-x86_64* - 包名:`perl-Data-Random.noarch`
额外小技巧
如果你想直接修改数组里的元素(比如给包名加后缀),可以直接在数组循环里操作,修改会同步到原%config中:
foreach my $package (@$pkg_array) { $package .= ".rpm"; # 给每个包名加上.rpm后缀 print " - 修改后的包名:`$package`\n"; }
内容的提问来源于stack exchange,提问作者Bromin257
相关产品推荐
相关产品推荐

