我在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";
Run Code Online (Sandbox Code Playgroud)
这是输出,我想要在第一个地图之后阅读完全像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 !!!
Run Code Online (Sandbox Code Playgroud)
你的问题从这里开始(我猜):
@virtualMachines{$vmNames[$i]} = @tuple;
Run Code Online (Sandbox Code Playgroud)
@hash{...}是一个哈希切片:它一次访问哈希中的多个条目(这可能只是一个条目).作为LHS值的切片强加列表上下文.
在此列表中,我们分配了值@tuple.
现在列表赋值具有忘记多余值的属性:
my ($x, $y) = (1, 2, 3); # nobody likes ? 3
Run Code Online (Sandbox Code Playgroud)
所以上面的陈述是一样的
$virtualMachines{ $vmNames[$i] } = $tuple[0];
Run Code Online (Sandbox Code Playgroud)
具体来说,这为该%virtualMachines条目分配了一个数组引用,因为@tuple只保存了arrayrefs.
在下一行,您可以通过访问此条目$virtualMachines{$vmNames[$i]}.这将计算为数组引用.然后,您将其取消引用到数组@{ ... }.
这会将该数组的所有值分配给@DEBUG,而不是数组引用.如调试语句中所示,这是VMstoreName.
为该%virtualMachines条目分配一个arrayref :
$virtualMachines{ $vmNames[$i] } = \@tuple;
Run Code Online (Sandbox Code Playgroud)
数组和散列只能包含标量,因此我们不能将数组用作值,只能使用数组引用.