不能使用解冻,而不是标量字符串在../../lib/Storable.pm但是“REF”数据

时间:2013-11-19 07:14:01

标签: perl hash

在执行此代码之后:

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,以及如何从那里提取我需要的字符串?

2 个答案:

答案 0 :(得分:3)

thaw期望由freezenfreeze创建一个字节字符串,但您要传递一些引用。


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);