为什么我的perl哈希变形我的数组数据?

时间:2013-06-14 20:57:06

标签: perl

我在Perl中遇到过一些有趣的行为,希望能够得到启发。 如您所见,我创建了一个名为@tuple的数组,它有两个数组引用。当我将它分配给一个键并提取它时,我只获得与引用相关的第一个数组VALUE。谁能告诉我为什么会这样?

my @VMstoreName = ($storeName[$i]);
my @VMdiskCap   = ($diskCap[$i]);
print "VMstoreName : ". join(' ', @VMstoreName) . "\n";
print "VMdiskCap : ". join(' ', @VMdiskCap) . "\n";
# Initializing our key
my @tuple =  (\@VMstoreName, \@VMdiskCap);
print "After tuple " . join(' ', @tuple) . "\n";

@virtualMachines{$vmNames[$i]} = @tuple;
my @DEBUG = @{$virtualMachines{$vmNames[$i]}};
print "After first map : " . join(' ', @DEBUG) . "\n";
print "WHAT??? $DEBUG[0] $DEBUG[1]!!!\n";

这是输出,我希望在第一个地图之后读取完全像After tuple

VMstoreName : 172.16.1.3:/export/Paul/test-0
VMdiskCap : 1   
After tuple ARRAY(0x2c4ccf0) ARRAY(0x2c4cd38)
After first map 172.16.1.3:/export/Paul/test-0
WHAT??? 172.16.1.3:/export/Paul/test-0 !!!

4 个答案:

答案 0 :(得分:7)

你的问题从这里开始(我猜):

 @virtualMachines{$vmNames[$i]} = @tuple;

@hash{...}是一个哈希切片:它一次访问哈希中的多个条目(这可能只是一个条目)。作为LHS值的切片强加了列表上下文。

在此列表中,我们指定@tuple

的值

现在列表赋值具有忘记多余值的属性:

my ($x, $y) = (1, 2, 3); # nobody likes № 3

所以上面的陈述与

相同
$virtualMachines{ $vmNames[$i] } = $tuple[0];

具体来说,这会为%virtualMachines条目指定一个数组引用,因为@tuple只保存arrayrefs。

在下一行,您可以通过$virtualMachines{$vmNames[$i]}访问此条目。这将计算为数组引用。然后,取消引用到具有@{ ... }的数组。

这会将该数组的所有值分配给@DEBUG,而不是数组引用。如调试语句中所示,这是VMstoreName。

解决方案

将arrayref分配给%virtualMachines条目:

$virtualMachines{ $vmNames[$i] } = \@tuple;

数组和散列只能 持有标量,因此我们不能将数组用作值,只能使用数组引用

答案 1 :(得分:3)

您使用相同的密钥在列表上下文中分配哈希值。键必须在哈希中是唯一的,因此只有一个引用存储在哈希中。哈希切片只有1个元素宽,因此第二个引用会被忽略。

您应该使用标量上下文将引用分配给@tuple

$virtualMachines{$vmNames[$i]} = \@tuple;

答案 2 :(得分:-2)

初始化@tuple时,您正在传递对数组的引用。相反,只需传递数组:

my @tuple = (@VMstoreName, @VMdiskCap);

答案 3 :(得分:-2)

看起来@tuple是一个数组引用数组。你必须尊重每个元素,以你想要的方式打印它们。

my @tuple =  (\@VMstoreName, \@VMdiskCap);
print "After tuple " . join(' ', map { @$_ } @tuple) . "\n";