我对以下两个片段的输出差异感到困惑:
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中显示的方式扩展它,但失败了。
我的理解
将数组分配给标量时,其计数将存储在该标量中。无论阵列的内容如何,我都认为这很好。
我不想在这里找到解决方案,但我想纠正我的理解。
答案 0 :(得分:1)
查看perldata中的列表值构造函数。您没有创建$ q作为数组引用,您只是将列表中的最后一个值分配给$ q。因此,任何将$ q视为数组引用的尝试都无法按预期工作。