Perl使用Tie::IxHash创建有序哈希时如何访问对应键值
问题根因
你调用Tie::IxHash->new()得到的是绑定对象,不是普通哈希引用,也不能直接当成哈希变量操作,所以你之前的访问语法都不生效。
解决方案
方案1(最推荐):用tie语法绑定到哈希变量
绑定后可以完全复用普通哈希的操作语法,同时保留键的插入顺序,适配你后续生成XML的需求:
use strict; use warnings; use diagnostics; use Scalar::Util; use Data::Dumper; use XML::Writer; use Tie::IxHash; use DateTime::Format::XSD; my $dt = DateTime->now; my $timestamp = DateTime::Format::XSD->format_datetime($dt); my $transmissionId = sprintf("%u",int(rand(100000000000000000000))). "E"; # 绑定顶层哈希 my %transmissionHeader; tie %transmissionHeader, 'Tie::IxHash', ( TransmissionId => "$transmissionId", Timestamp => "$timestamp", # 嵌套哈希也绑定Tie::IxHash保留顺序 Transmitter => do { my %trans; tie %trans, 'Tie::IxHash', ( ETIN => '1232456789', SOME => '5555555555', ); \%trans; } ); # 访问和普通哈希完全一致 print Dumper \%transmissionHeader; print $transmissionHeader{Transmitter}{ETIN}."\n"; print $transmissionHeader{Timestamp}."\n";
后续你遍历键用keys %transmissionHeader,返回的顺序就是你定义时的插入顺序,满足生成XML的顺序要求。
方案2:直接用对象方法取值
如果你坚持用Tie::IxHash->new返回的对象操作,可以调用FETCH方法传入键名取值:
# 原有对象定义不变 my $transmissionHeader = Tie::IxHash->new( TransmissionId => "$transmissionId", Timestamp => "$timestamp", Transmitter => Tie::IxHash->new( ETIN => '1232456789', SOME => '5555555555', ), ); # 用FETCH方法取值 print $transmissionHeader->FETCH('Transmitter')->FETCH('SOME')."\n";
原有写法的错误说明
$transmissionHeader{Transmitter}:$transmissionHeader是对象不是哈希变量,不能直接用哈希变量的键访问语法$transmissionHeader->{Transmitter}:->是哈希引用的解引用语法,$transmissionHeader是绑定对象不是哈希引用,不生效$transmissionHeader->Transmitter():Tie::IxHash不会自动生成和键名对应的对象方法,调用会报错
内容的提问来源于stack exchange,提问作者turtle
相关产品推荐
相关产品推荐

