首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当请求arrayref时,perl中绑定哈希的奇怪行为

当请求arrayref时,perl中绑定哈希的奇怪行为
EN

Stack Overflow用户
提问于 2015-11-16 15:26:23
回答 3查看 767关注 0票数 5

我试图按照跟踪变量用法的顺序绑定散列(或hashref)。

所有的东西都适用于简单的情况,但是当我试图在一些真正的代码上使用我的模块时,我出现了以下错误:

代码语言:javascript
复制
hash- or arrayref expected (not a simple scalar, use allow_nonref to allow this)

我使用以下代码复制了错误:

代码语言:javascript
复制
use Tie::Hash::Usages;
use JSON;

my @arr = (
    {
        key1 => "ac",
        key2 => 12,
        key3 => 12
    },        
);
my %tied_hash;


tie %tied_hash, 'Tie::Hash::Usages';

$tied_hash{key1} = \@arr;

my @val = $tied_hash{key1};
print encode_json(\@val)."\n\n"; #this works

print encode_json($tied_hash{key1}); #this doesn't

相同的代码适用于普通散列。

在第二种情况下,我也需要这样做,因为代码库很大,我不想改变它,也不想怀疑某个地方在某些特定情况下不能工作。

Usages.pm (简化)

代码语言:javascript
复制
package Tie::Hash::Usages;
use strict;
use warnings;

use Tie::Hash;

use vars qw(@ISA);

@ISA = qw(Tie::StdHash);

sub TIEHASH {

    my ($class, $tracker, $filename) = @_;
    my %hash;

    bless \%hash, $class;

}

sub STORE {
    my ($self, $key, $val) = @_;
    $self->{$key} = $val;
}

sub DELETE {
    my ($self, $key) = @_;
    delete $self->{$key};

}

sub FETCH {
    my ($self, $key) = @_;
    return $self->{$key};
}

sub DESTROY {
    my $self = shift;
}
1;

perl版本: v5.18.2

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-11-16 16:52:40

最低限度的示范:

代码语言:javascript
复制
use JSON::XS  qw( encode_json );
use Tie::Hash qw( );

our @ISA = 'Tie::StdHash';

{
   tie my %tied, __PACKAGE__;
   $tied{data} = { a => 1 };
   encode_json($tied{data});  # Exception: hash- or arrayref expected ...
}

JSON是JSON::PP (默认值)或JSON::XS (如果找到)的前端。这是JSON::XS的一个问题。

许多XS代码不处理神奇的变量(这是$tied{EXPR}返回的变量),虽然JSON::XS从1.2版本开始就处理了神奇的值,但是对于直接传递给encode_json的值却没有处理。

这是JSON::XS中存在的一个bug,可以按以下方式处理:

代码语言:javascript
复制
encode_json(my $non_magical = $tied{data})

Bug 已报告.

票数 6
EN

Stack Overflow用户

发布于 2015-11-16 15:59:12

无法使用给定的代码进行复制,因此您所提供的内容似乎并不代表您的实际情况。我看到的唯一最微小的一点就是这条线:

代码语言:javascript
复制
my @val = $tied_hash{key1};

其中,要将标量(存储的数组)分配给数组。Perl处理这个问题,将标量作为唯一内容组装一个数组,但是如果您的实际用例涉及更复杂的东西(可能涉及到一些子原型),那么可能会出现一些问题。

票数 1
EN

Stack Overflow用户

发布于 2018-06-27 06:28:35

以太做得对。默认情况下,JSON库使用JSON:XS (这就产生了这个问题)。我所要做的就是卸载JSON::XS并安装JSON::PP

  1. 苏丹
  2. 安装cpan应用程序::cpan减号
  3. 出口
  4. sudo cpanm --卸载JSON::XS
  5. 苏丹
  6. 安装JSON::PP
  7. 出口

希望这能帮上忙。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33738849

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档