首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >混合散列不能正常工作

混合散列不能正常工作
EN

Stack Overflow用户
提问于 2014-02-25 15:09:19
回答 3查看 59关注 0票数 1

我正在创建这个散列

代码语言:javascript
复制
    my %obj_cuentascontables = {
        '4210' => {
            'banderamayor' => 'true',
            'enlace' => 'true',
            'not_rlike_nombre' => 'DEVOLUCION'
    },
        '4410' => {
            'banderamayor' => 'true',
            'enlace' => 'true',
            'rlike_nombre' => 'DEVOLUCION',
            'categoria_cuenta' => 'DEVOLUCIONES REBAJAS Y DESCUENTOS'
        }
};

my %param = {
         'concepto_ID' => "$concepto_ID",
         'formato_ID' => $formato_ID,
         'obj_cuentascontables'=> { %obj_cuentascontables },
};

然后我抛弃了%param,我得到了这个:

代码语言:javascript
复制
$VAR1 = {
          'concepto_ID' => '5501',
          'formato_ID' => 1001,
          'obj_cuentascontables' => {
                                      'HASH(0xf16eb70)' => undef
                                    }
        };

我不能使用‘散列’的东西,所以,我试图看看我是否引用了错误的哈希,我创建了另一个非常相似的。

代码语言:javascript
复制
my %obj_cuentascontables = ();
    $obj_cuentascontables{'4210'}{'banderamayor'} = 'true';
    $obj_cuentascontables{'4210'}{'enlace'} = 'true';
    $obj_cuentascontables{'4210'}{'not_rlike_nombre'} = 'DEVOLUCION';
    $obj_cuentascontables{'4410'}{'banderamayor'} = 'true';
    $obj_cuentascontables{'4410'}{'enlace'} = 'true';
    $obj_cuentascontables{'4410'}{'rlike_nombre'} = 'DEVOLUCION';
    $obj_cuentascontables{'4410'}{'categoria_cuenta'} = 'DEVOLUCIONES REBAJAS Y DESCUENTOS';

    my %param = ();
    $param{'concepto_ID'}= $concepto_ID;
    $param{'formato_ID'} = $formato_ID;
    $param{'obj_cuentascontables'} = \%obj_cuentascontables;

然后Dumper还说:

代码语言:javascript
复制
$VAR1 = {
          'concepto_ID' => 5501,
          'formato_ID' => 1001,
          'obj_cuentascontables' => {
                                      '4410' => {
                                                  'enlace' => 'true',
                                                  'rlike_nombre' => 'DEVOLUCION',
                                                  'categoria_cuenta' => 'DEVOLUCIONES REBAJAS Y DESCUENTOS',
                                                  'banderamayor' => 'true'
                                                },
                                      '4210' => {
                                                  'enlace' => 'true',
                                                  'not_rlike_nombre' => 'DEVOLUCION',
                                                  'banderamayor' => 'true'
                                                }
                                    }
        };

我的问题是,为什么?我要在我的第一个建筑里的第二个垃圾场.有可能吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-02-25 15:14:39

永远使用use strict; use warnings;!后者会识别出错误。

代码语言:javascript
复制
$ perl -e'use strict; use warnings; my %obj_cuentascontables = { };'
Reference found where even-sized list expected at -e line 1.

当列表期望标量列表用作键和值时,您将为其分配散列引用。记住

代码语言:javascript
复制
{ ... }

大致是

代码语言:javascript
复制
do { my %anon = ( ... ); \%anon }

所以

代码语言:javascript
复制
my %obj_cuentascontables = { ... };

应该是

代码语言:javascript
复制
my %obj_cuentascontables = ( ... );
票数 4
EN

Stack Overflow用户

发布于 2014-02-25 15:13:14

如果仔细研究如何在第一个片段中构造哈希,就会使用大括号{}。在赋值上下文中,这是将哈希引用分配给哈希。

您需要的是圆括号()

代码语言:javascript
复制
my %obj_cuentascontables = (
    '4210' => {
            'banderamayor' => 'true',
            'enlace' => 'true',
            'not_rlike_nombre' => 'DEVOLUCION'
    },
    '4410' => {
            'banderamayor' => 'true',
            'enlace' => 'true',
            'rlike_nombre' => 'DEVOLUCION',
            'categoria_cuenta' => 'DEVOLUCIONES REBAJAS Y DESCUENTOS'
    }
);

这就是为什么您应该使用use warnings;,因为它会警告您这一点:

代码语言:javascript
复制
Reference found where even-sized list expected ...
票数 5
EN

Stack Overflow用户

发布于 2014-02-25 16:47:42

您没有使用use warnings;,这将帮助您看到奇数错误。

我假设您希望您的$param{obj_cuentascontables}指向散列%obj_cuentascontables。这样,您可以参考:

代码语言:javascript
复制
$param{obj_cuentascontables}->{4210}->{banderamayor}

具有true的值。

您需要为%obj_cuentascontables哈希中的obj_cuentascontables键的值指定一个对%param哈希的引用。

代码语言:javascript
复制
my %param = {
         concepto_ID          => "$concepto_ID",
         formato_ID           => $formato_ID,
         obj_cuentascontables => \%obj_cuentascontables,
};

我倾向于在引用引用时使用->语法。从官方角度来看,这两者是相同的:

代码语言:javascript
复制
$param{obj_cuentascontables}->{4210}->{banderamayor}
$param{obj_cuentascontables}{4210}{banderamayor}

但是,我发现使用->语法提醒我,这实际上不是哈希,而是对哈希的引用。这有助于我在构建这些复杂的数据结构时正确使用语法。

你所做的与此类似:

代码语言:javascript
复制
my $hash_address = sprintf "%s", \%obj_cuentascontables; # Stingifying the hash reference
$param{obj_cuentascontables} = { };
$param{obj_cuentascontables} = { $hash_address => };     # Not 100% Perl will parse this...

您为$param{obj_cuentascontables}分配了一个散列引用,这正是您想要的,但是您随后使用哈希地址作为键,而不使用任何值。

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

https://stackoverflow.com/questions/22018240

复制
相关文章

相似问题

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