无法在perl中打印此复杂数据结构的值

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

标签: perl

问题解释为代码中的评论:

我有一段代码,其中我正在尝试创建一个哈希,其中键本身是对其他数组的引用。

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"没打印?

2 个答案:

答案 0 :(得分:3)

哈希键始终是一个字符串,您不能在那里存储引用。我无法想出你也想要这个的原因。

您应该始终use strictuse 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