我正在为我们在工作中需要的 perl 模块构建一个安装程序。安装所有依赖项后,我需要检查模块是否正常工作“使用 This::Module”。问题是,所有模块都按特定顺序安装。
哈希看起来像...
my %modules=(
0 => {'name' => '/root/mods/CGI/perl-FCGI-0.74-8.amzn2.0.2.x86_64.rpm', 'method' => 'rpm', 'status'=>'pending'},
1 => {'name' => '/root/mods/CGI/perl-CGI-3.63-4.amzn2.noarch.rpm', 'method' => 'rpm','status'=>'done', 'validate' => ['CGI','CGI::Carp']},
2 => {'name' => '/root/mods/Digest/perl-Digest-1.17-245.amzn2.noarch.rpm', 'method' => 'rpm','status'=>'pending'},
3 => {'name' => '/root/mods/Digest/perl-Digest-MD5-2.52-3.amzn2.0.2.x86_64.rpm', 'method' => 'rpm','status'=>'done', 'validate' => ['Digest::MD5']},
4 => {'name' => '/root/mods/HTTP/perl-Business-ISBN-Data-20120719.001-2.el7.noarch.rpm','method' => 'rpm','status'=>'pending'},
5 => {'name' => '/root/mods/HTTP/perl-Data-Dumper-2.145-3.el7.x86_64.rpm','method' => 'rpm','status'=>'pending'},
6 => {'name' => '/root/mods/HTTP/perl-Business-ISBN-2.06-2.el7.noarch.rpm','method' => 'rpm','status'=>'done'}, 'validate' => ['HTTP::Request::Common']},
Run Code Online (Sandbox Code Playgroud)
每个换行符都是一个新模块的开始。一旦“状态”=>“完成”,我需要访问“验证”中的模块。这是一个数组,因为在某些情况下,多个模块绑定到一个安装序列。
如何循环遍历并自行返回每个数组元素?
Run Code Online (Sandbox Code Playgroud)'validate' => {['CGI','CGI::Carp']}},
你没有数组。
的值validate介于两者之间{,}因此它是一个 hashref。
arrayref 是散列中的第一个条目,因此它被转换为字符串以用作键。
你最终会得到类似的东西:
{
'name' => '/root/mods/CGI/perl-CGI-3.63-4.amzn2.noarch.rpm',
'method' => 'rpm',
'status' => 'done',
'validate' => {
'ARRAY(0x7f9ab601c4e0)' => undef
}
};
Run Code Online (Sandbox Code Playgroud)
确保您use strict;和use warnings;. 它会提醒您注意这一点:
Untitled.pl 第 9 行匿名散列中的奇数元素。
您需要修复数据结构。如果你想要一个数组,那么把它放在一个数组中。
#!/usr/bin/perl
use strict;
use warnings;
use v5.10;
use Data::Dumper;
my %modules = (
0 => {
'name' => '/root/mods/CGI/perl-FCGI-0.74-8.amzn2.0.2.x86_64.rpm',
'method' => 'rpm',
'status' => 'pending'
},
1 => {
'name' => '/root/mods/CGI/perl-CGI-3.63-4.amzn2.noarch.rpm',
'method' => 'rpm',
'status' => 'done',
'validate' => [ 'CGI', 'CGI::Carp' ]
},
);
Run Code Online (Sandbox Code Playgroud)
然后你可以访问arrayref:
my $arrayref = $modules{1}->{validate};
Run Code Online (Sandbox Code Playgroud)
并循环它:
foreach my $value (@$arrayref) {
say $value
}
Run Code Online (Sandbox Code Playgroud)