我在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 !!!
答案 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";