如何访问哈希中的数组?

-3 arrays perl hash

我正在为我们在工作中需要的 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)

每个换行符都是一个新模块的开始。一旦“状态”=>“完成”,我需要访问“验证”中的模块。这是一个数组,因为在某些情况下,多个模块绑定到一个安装序列。

如何循环遍历并自行返回每个数组元素?

Que*_*tin 6

'validate' => {['CGI','CGI::Carp']}},
Run Code Online (Sandbox Code Playgroud)

你没有数组。

的值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)