如何使用值为数组的标量键创建和访问Perl哈希?

时间:2009-07-08 17:11:28

标签: perl arrays reference

在Perl 5.10中,如何使用值为数组的标量键创建和访问哈希?

#Doing this does not work properly.
%someHash= ("0xfff" => ('Blue', 'Red', 'Yellow'));
@arr = @fileContents{"0xfff"};
print @arr;

当我打印数组时,唯一打印的是“ARRAY('randmemAddr')”。当我在@arr上执行foreach循环时,只打印第一个元素。然后我得出结论,我没有正确地将数组存储在哈希中。

4 个答案:

答案 0 :(得分:12)

我原来的答案发布了工作代码,但没有真正解释你的问题。这有点扩展以纠正这一点。你的例子有两个问题。首先,您在制作参考时遇到了问题。您需要使用[ ]而不是标准括号来创建引用(对匿名数组)。其次,当你试图获得参考时,你就离开了一组括号。您希望将引用本身放在@{ }中以获取整个数组。 (另外,这可能是一个错字:$之前没有filecontents。)

此处的代码主要来自perldoc perldsc。我强烈推荐它。如果您对Perl中的引用不熟悉也很有用perldoc perlreftut。这两个教程都讨论了如何在各种情况下制作和获取参考文献。最后,您可以在PerlMonks上的帖子中找到一个好的备忘单供参考。

#!/usr/bin/env perl
use strict;
use warnings;


my %HoA = (
    flinstones      => [ qw/fred barney/ ],
    jetsons         => [ qw/george jane elroy/ ],
);

for my $family (keys %HoA) {
    print "Members of the \u$family:\n";
    print "\t @{ $HoA{$family} }\n";
}

答案 1 :(得分:4)

您需要更明确地存储对数组的引用,然后将其解除引用。

试试这个:

#Doing this doeswork properly.
%someHash= ("0xfff" => ['Blue', 'Red', 'Yellow']);
@arr = @{$fileContents{"0xfff"}};
print @arr;

注意,当使用它时,parens转向括号和演员。

答案 2 :(得分:3)

我发现使用Data::Dumper模块更容易。你的perl发行版附带的赔率非常高。它允许您快速查看数据结构。

在你的情况下,它将是:

use Data::Dumper;
my %someHash= ("0xfff" => ('Blue', 'Red', 'Yellow'));
print Dumper \%someHash;

这将输出:

$VAR1 = {
    'Red' => 'Yellow',
    '0xfff' => 'Blue'
};

当然,要修复它,您需要将数组存储为参考:

use Data::Dumper;
my %someHash= ("0xfff" => [qw(Blue Red Yellow)]);
print Dumper \%someHash;

将产生:

$VAR1 = {
            '0xfff' => [
                           'Blue',
                           'Red',
                           'Yellow'
                       ]
        };

底线是Data :: Dumper是你最好的朋友

答案 3 :(得分:2)

散列或数组元素总是标量(除了在某些内部使用,Perl不能直接使用),因此您可以存储对数组的引用,但不能存储数组。