Perl将哈希数组分配给标量

时间:2015-02-13 09:39:24

标签: arrays perl hash reference

我对以下两个片段的输出差异感到困惑:

SNIPPET 1

use Data::Dumper; 
my $q = (   
          { q=>1,  w=>2 }, 
          { i=>8 }, 
); 
print "\nOUTPUT_1   $q=[".$q."] "; 

print "\nOUTPUT_2   ".Data::Dumper::Dumper ($q); 
$q[0]->{a} = "5"; 

print "\nOUTPUT_3   ".Data::Dumper::Dumper ($q);

输出

OUTPUT_1   HASH(0x872de10)=[HASH(0x872de10)]  
OUTPUT_2   $VAR1 = {
          'i' => 8
        };

OUTPUT_3   $VAR1 = {
          'i' => 8
        };

SNIPPET 2

use Data::Dumper; 
my $q = (
         { q=>1, w=>2 }, 
); 
print "\nOUTPUT_1   $q=[".$q."] "; 

print "\nOUTPUT_2   ".Data::Dumper::Dumper ($q); 
$q[0]->{a} = "5"; 

print "\nOUTPUT_3   ".Data::Dumper::Dumper ($q);

输出

OUTPUT_1   HASH(0x81861bc)=[HASH(0x81861bc)]  
OUTPUT_2   $VAR1 = {
          'w' => 2,
          'q' => 1
        };

OUTPUT_3   $VAR1 = {
          'w' => 2,
          'q' => 1
        };

我看到了生产代码中使用的第二个代码段。我试图以Snippet 1中显示的方式扩展它,但失败了。

我的理解
将数组分配给标量时,其计数将存储在该标量中。无论阵列的内容如何,​​我都认为这很好。

我不想在这里找到解决方案,但我想纠正我的理解。

1 个答案:

答案 0 :(得分:1)

查看perldata中的列表值构造函数。您没有创建$ q作为数组引用,您只是将列表中的最后一个值分配给$ q。因此,任何将$ q视为数组引用的尝试都无法按预期工作。