【问题标题】:How can I access an Array within a Hash? [closed]如何访问哈希中的数组? [关闭]
【发布时间】:2021-01-18 04:14:15
【问题描述】:

我正在为我们在工作中需要的 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']},
            

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

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

【问题讨论】:

  • 你试过什么?您在哪里遇到问题?
  • 我尝试遍历哈希的索引,然后通过验证,但每次我都不会得到任何返回。我能够使用“print @{$modules{1}{'validate'}};”成功打印数组内容但我无法成功循环遍历数组。

标签: arrays perl hash


【解决方案1】:
'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
                    }
};

确保您使用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' ]
    },
);

然后就可以访问arrayref了:

my $arrayref = $modules{1}->{validate};

然后循环:

foreach my $value (@$arrayref) {
    say $value
}

【讨论】:

  • 我明白你在说什么,但我仍然收到“不是数组引用”。我的数组还有其他问题吗?
猜你喜欢
  • 2023-03-31
  • 2013-10-11
  • 2015-06-26
  • 1970-01-01
  • 2013-03-22
  • 2013-03-08
  • 1970-01-01
  • 2014-07-16
  • 1970-01-01
相关资源
最近更新 更多