如何从Perl数组中取出哈希?代码无输出问题排查
问题分析与修正
你的代码存在三个关键错误,导致无法输出预期的bb:
1. 哈希初始化错误
my %x = {}; 是错误写法。Perl中{}创建的是哈希引用(标量类型),而哈希变量%x需要接收键值对列表。正确的空哈希初始化方式是:
my %x; # 直接声明,简洁高效 # 或者 my %x = ();
原代码会把哈希引用转换成字符串(如HASH(0xabc123))作为哈希的唯一键,对应值为undef,后续$x{'aa'} = 'bb';只是新增了另一个键值对,完全偏离了你的预期。
2. 哈希存入数组的方式错误
push(@items, $x); 中的$x是哈希的符号引用,并非正确的存储方式。如果要把整个哈希存入数组,应该存储哈希引用:
push(@items, \%x); # 用\%x获取哈希的引用
如果直接push%x,Perl会把哈希展开成键值对列表(比如'aa', 'bb'),数组最终会变成('aa', 'bb'),而非包含哈希的数组。
3. 从数组取出哈希的错误
my %i = @items[0]; 是错误的解引用方式。数组里存的是哈希引用,需要用%{$items[0]}来解引用为哈希:
my %i = %{$items[0]};
原代码中@items[0]是单元素数组切片,等同于$items[0],直接把标量赋值给哈希变量,会导致哈希只有一个键(标量的字符串形式),值为undef,自然无法输出bb。
修正后的完整代码:
my @items = (); my %x; # 正确初始化哈希 $x{'aa'} = 'bb'; push(@items, \%x); # 存入哈希引用 my %i = %{$items[0]}; # 正确解引用 print $i{'aa'}; # 输出bb
内容的提问来源于stack exchange,提问作者yegor256
相关产品推荐
相关产品推荐

