在Perl 5.10中,如何使用值为数组的标量键创建和访问哈希?
#Doing this does not work properly.
%someHash= ("0xfff" => ('Blue', 'Red', 'Yellow'));
@arr = @fileContents{"0xfff"};
print @arr;
当我打印数组时,唯一打印的是“ARRAY('randmemAddr')”。当我在@arr上执行foreach循环时,只打印第一个元素。然后我得出结论,我没有正确地将数组存储在哈希中。
答案 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不能直接使用),因此您可以存储对数组的引用,但不能存储数组。