Perl按索引打印哈希值时数组显示undef如何修改代码
问题根因
- Perl哈希的键和值都只能是标量类型,不支持直接存入数组、哈希这类聚合数据结构,要存这类结构必须传入对应的引用。
- 你代码里写的
$array1是独立于数组@array1的标量变量,全程没有给这个标量赋值,所以它的默认值是undef,最终输出B键对应的值就是undef。就算你把这里改成@array1也无法得到预期结果:哈希赋值是列表上下文,直接传入数组会把数组元素全部扁平化展开,打乱原有的键值对配对逻辑。
修正方案
将数组以数组引用的形式赋值给哈希键即可,有两种常用实现:
方案1:绑定原数组引用
用\取数组的引用存入哈希,后续修改原数组@array1时,哈希中B键对应的值会同步变化:
my $a="A"; my $b="B"; my @array1=qw(4 5 6 7); my %hash1= ($a => 123, $b => \@array1); use Data::Printer; p %hash1;
方案2:存入数组的匿名拷贝
用[]生成匿名数组,将原数组的元素拷贝进匿名数组再存入哈希,后续修改原数组不会影响哈希内存储的内容:
my $a="A"; my $b="B"; my @array1=qw(4 5 6 7); my %hash1= ($a => 123, $b => [@array1]); use Data::Printer; p %hash1;
运行上述任意一段代码,都能得到你预期的输出结果:
{ A 123, B [ [0] 4, [1] 5, [2] 6, [3] 7 ] }
内容的提问来源于stack exchange,提问作者blueFish
相关产品推荐
相关产品推荐

