Perl中为什么无法向哈希存储的数组执行push插入操作?
问题根本原因
- 你主动关闭了
strict和warnings,屏蔽了Perl所有的语法错误和不合理写法提示,这是所有问题的根源。 - 你对数组引用的解引用语法使用错误:
- 第12行代码
my @temp = $allHash{$key1};写法错误:$allHash{$key1}存储的是数组的引用(就是你输出里看到的ARRAY(0xxxx)格式的内存地址),直接赋值给数组@temp只会让@temp的第一个元素等于这个引用,而不会把引用指向的数组元素展开。正确写法应该是my @temp = @{$allHash{$key1}};,加解引用符号@{}才能拿到实际的数组内容。 - 第22行代码
@temp = @{allHash{$key1}};写法错误:你漏掉了哈希变量名前的$符号,allHash没有符号前缀,在关闭strict的场景下Perl会把它解析为裸词,而非你定义的%allHash哈希,导致取到的值完全不符合预期。
- 第12行代码
- 你调试用的打印逻辑存在错误:
$allHash{$key1}[0][0]这类二维下标的写法没有意义,你push到数组里的是普通字符串item1、item2,不是数组引用,把字符串当成数组引用去取第二个维度的下标,当然只能得到空值,这和push是否生效完全无关。
为什么你另一段代码可以正常运行
你给出的可用代码里没有出现上述两个低级语法错误,push的写法push @{$hedgeHash{$Hstub}}, $i;是完全正确的解引用写法,自然可以正常运行。
为什么去掉push括号后表现更异常
Perl的函数括号是用来明确参数边界的,去掉括号后Perl会按照运算符优先级来解析参数,你的代码里本来就存在裸词、解引用错误的问题,去掉括号后参数解析逻辑会进一步混乱,自然会出现更不符合预期的输出。
修复建议
- 打开
use strict;和use warnings;,它会直接定位你所有的语法错误,不需要你盲目打印调试。 - 修正所有解引用错误的写法,你要的功能只需要下面几行就可以实现:
use strict; use warnings; my %allHash = (); my $key1 = "key1"; my $item1 = "item1"; my $item2 = "item2"; push @{$allHash{$key1}}, $item1; push @{$allHash{$key1}}, $item2; # 打印验证,输出item1 item2,符合你的预期 print join " ", @{$allHash{$key1}};
内容的提问来源于stack exchange,提问作者user1067305
相关产品推荐
相关产品推荐

