Perl 无法在.././lib/Storable.pm处使用解冻,而不是标量字符串;参考「;数据

Perl 无法在.././lib/Storable.pm处使用解冻,而不是标量字符串;参考「;数据,perl,hash,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 in

执行此代码后:

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),带有模拟代码。 因此,兔脚输出为:

 [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
$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,
        };
我可以这样处理它(所以它是解冻方法的Ok字符串)

但是,rabbitMQ库输出为:

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

saw
需要一个由
freeze
nfreeze
创建的字节字符串,但您正在传递一些引用


REF是对引用的引用

>perl -E"say ref \%h"
HASH

>perl -E"say ref \\%h"
REF
如果引用的引用是对所需散列的引用,则使用

my $hash = ${ $ref };       # Reference to hash


但是,您最好修复提供哈希ref的代码,改为提供哈希ref。

saw
需要一个由
freeze
nfreeze
创建的字节字符串,但您正在传递一些引用


REF是对引用的引用

>perl -E"say ref \%h"
HASH

>perl -E"say ref \\%h"
REF
如果引用的引用是对所需散列的引用,则使用

my $hash = ${ $ref };       # Reference to hash


但是,您最好修复提供哈希ref的代码,改为提供哈希ref。

saw
需要一个由
freeze
nfreeze
创建的字节字符串,但您正在传递一些引用


REF是对引用的引用

>perl -E"say ref \%h"
HASH

>perl -E"say ref \\%h"
REF
如果引用的引用是对所需散列的引用,则使用

my $hash = ${ $ref };       # Reference to hash


但是,您最好修复提供哈希ref的代码,改为提供哈希ref。

saw
需要一个由
freeze
nfreeze
创建的字节字符串,但您正在传递一些引用


REF是对引用的引用

>perl -E"say ref \%h"
HASH

>perl -E"say ref \\%h"
REF
如果引用的引用是对所需散列的引用,则使用

my $hash = ${ $ref };       # Reference to hash

但是,您最好修复提供hash ref的代码,改为提供hash ref。

答案是

$hashref = $hashref->{body}; ####this string
my $output = thaw($hashref);
答案是

$hashref = $hashref->{body}; ####this string
my $output = thaw($hashref);
答案是

$hashref = $hashref->{body}; ####this string
my $output = thaw($hashref);
答案是

$hashref = $hashref->{body}; ####this string
my $output = thaw($hashref);


使用严格;使用警告是的,我有。上面的代码只是代码的一部分,是什么让你认为$mq->get($channel,$queue)是你可以传递给解冻的东西?该值来自何处?它来自RabbitMQ服务器。在服务器端,哈希被“冻结”。
使用strict;使用警告是的,我有。上面的代码只是代码的一部分,是什么让你认为$mq->get($channel,$queue)是你可以传递给解冻的东西?该值来自何处?它来自RabbitMQ服务器。在服务器端,哈希被“冻结”。
使用strict;使用警告是的,我有。上面的代码只是代码的一部分,是什么让你认为$mq->get($channel,$queue)是你可以传递给解冻的东西?该值来自何处?它来自RabbitMQ服务器。在服务器端,哈希被“冻结”。
使用strict;使用警告是的,我有。上面的代码只是代码的一部分,是什么让你认为$mq->get($channel,$queue)是你可以传递给解冻的东西?该值来自何处?它来自RabbitMQ服务器。在服务器端,散列被“冻结”。是的!这个库的名称是RabbitMQ(不工作),但是我的$hash_ref=thaw($body)是RabbitFoot;打印$hash_ref->{'User-Name'};很好用!是的!这个库的名称是RabbitMQ(不工作),但是我的$hash_ref=thaw($body)是RabbitFoot;打印$hash_ref->{'User-Name'};很好用!是的!这个库的名称是RabbitMQ(不工作),但是我的$hash_ref=thaw($body)是RabbitFoot;打印$hash_ref->{'User-Name'};很好用!是的!这个库的名称是RabbitMQ(不工作),但是我的$hash_ref=thaw($body)是RabbitFoot;打印$hash_ref->{'User-Name'};很好用!