Perl 将哈希数组分配给标量

Perl Assign Array of Hashes to scalar

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

片段 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
        };

片段 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
        };

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

我的理解
将数组分配给标量时,其计数将存储在该标量中。我相信无论数组的内容如何,​​这都适用。

我不想在这里解决,但我想纠正我的理解。

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