簡體   English   中英

為什么我的perl哈希會使我的數組數據變形?

[英]Why does my perl hash deform my array data?

我在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 first map完全像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 !!!

您的問題從這里開始(我想):

 @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;

數組和哈希只能容納標量,因此我們不能將數組用作值,只能使用數組引用

您正在使用相同的鍵分配給列表上下文中的哈希。 密鑰在哈希中必須唯一,因此哈希中僅存儲一個引用。 Hash-slice的寬度只有1個元素,因此第二個引用將被忽略。

您應該分配對@tuple引用 ,而不是使用標量上下文:

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

初始化@tuple時,您正在傳遞對數組的引用 相反,只需傳遞數組:

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

看起來@tuple是數組引用的數組。 您必須遵循每個元素,才能按預期方式打印出來。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM