问题解释为代码中的评论:
我有一段代码,其中我正在尝试创建一个哈希,其中键本身是对其他数组的引用。
my @arr1=(1,2,3,4,5,6,7,8,9,10);
my @arr2=(1001,1002,1003);
$FILES_1=\@arr1;
$num1=2;
$FILES_2=\@arr2;
$num2=4;
@FILES=($FILES_1, $FILES_2);
@NUMS=($num1,$num2);
fun (\@FILES,\@NUMS);
sub fun{
my ($rFILES,$rNUMS) = @_;
print "\n --${$rFILES}[0]->[2] \n "; # This is same as below
print "\n --$rFILES->[0]->[2] \n "; # This is same as above
my %hash=();
$hash{$rFILES->[0]} = $rNUMS->[0];
my $test = $rFILES->[0];
print "\nTEST : $test->[1]";
my @key = keys %hash;
print "\nKey 1 = $key[0]"; # This prints scalar value as below
print "\ntest = $test "; # This prints scalar value as above
print "\nKey 1->[1] = ${$key[0]}->[1]"; #PROBLEM : THIS DOESNT PRINT SAME AS BELOW
print "\ntest->[1] = $test->[1] "; #THIS PRINTS AS EXPECTED.
}
输出:
--3
--3
TEST : 2
Key 1 = ARRAY(0x1bbb540)
test = ARRAY(0x1bbb540)
Key 1->[1] =
test->[1] = 2
我们不应该将哈希的密钥保留为某个数组的引用吗?为什么价值" 2"没打印?
答案 0 :(得分:3)
哈希键始终是一个字符串,您不能在那里存储引用。我无法想出你也想要这个的原因。
您应该始终use strict
和use warnings
。如果您添加了这些变量并使用my
正确声明了变量,那么您会收到警告:
Can't use string ("ARRAY(0x85e628)") as a SCALAR ref while "strict refs" in use
您正在使用的语法:
${$key[0]}
说$key[0]
是对标量的引用。它不是,它是一个字符串,其中包含引用的地址,因为您不能将引用用作哈希键,它们将成为字符串。
<强>更新强>
你可能想要这样的东西:
my @filegroups = (
{ number => 1, files => ['file1','file2'] },
{ number => 2, files => ['file3'] },
);
访问:
foreach my $filegroup ( @$filegroups ) {
print "my number is $filegroup->{number}\n";
print " and I have ".scalar( @{ $filegroup->{ files } } )." files\n";
}
如果您需要额外的速度来按组号访问结构(除非您有数百个组或成千上万次访问,否则不要打扰),请将它们编入索引:
my %filegroupindexes = map { $_->{ number } => $_ } values @$filegroups;
然后你可以这样进入这个小组:
print "there are ".scalar( @{ $filegroupindexes{ 1 }->{ files } } )." files in group 1\n";
作为最后的提示,打印复杂的数据结构Data::Printer是我最喜欢的:
use Data::Printer colored => 1;
p( @filegroups );
答案 1 :(得分:0)
如果要将引用用作哈希键,则需要Tie::RefHash。