在执行此代码之后:
while(1){
my $hashref = $mq->get($channel, $queue);
next if (! defined($hashref));
my %hash_ref = %{ thaw($hashref) };
print Dumper($hash_ref);
sleep(1);
}
我得到了
Not a scalar string at ../../lib/Storable.pm (autosplit into ../../lib/auto/Storable/thaw.al) line 415, at ./accounting.pm line 21.
此外perl表示$ hashref是REF(0x1bf3780)。它的数据结构是什么?如何将其转换为哈希?
我有两个图书馆(RabbitFoot和RabbitMQ),带有simular代码。 所以,RabbitFoot输出是:
[x] Received 1234567
NAS-Port-Type
0Acct-Input-Octets
################################somedata
oeproverka User-Name
################################somedata
Nov 12 2013 20:19:28 MSKEvent-Timestamp
16777229NAS-Port
0Acct-Delay-Time
我可以这样做(所以它的解冻方法的Ok字符串)
my $hash_ref = thaw($body);
print $hash_ref->{'User-Name'};
但是,rabbitMQ库输出是:
$VAR1 = {
'body' => ' 12345678
ENAS-Port-Type
0Acct-Input-Octets
################################somedata
oeproverka User-Name
Nov 12 2013 20:19:28 MSKEvent-Timestamp
################################somedata
0Acct-Delay-Time',
'redelivered' => 1,
};
看看这个$ VAR1 = {},它是什么?为什么它是REF,以及如何从那里提取我需要的字符串?
答案 0 :(得分:3)
thaw
期望由freeze
或nfreeze
创建一个字节字符串,但您要传递一些引用。
REF是对参考的引用。
>perl -E"say ref \%h"
HASH
>perl -E"say ref \\%h"
REF
如果引用的引用是对所需哈希的引用,则使用
my $hash = ${ $ref }; # Reference to hash
或
my %hash = %{ ${ $ref } }; # Wastefully copies the hash.
但是你可能最好修复一下代码,它给你的hash ref ref代替了一个哈希引用。
答案 1 :(得分:0)
答案是
$hashref = $hashref->{body}; ####this string
my $output = thaw($hashref);