混合哈希无法正常工作

时间:2014-02-25 15:09:19

标签: perl hash

我正在创建此哈希

    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,我得到了这个:

$VAR1 = {
          'concepto_ID' => '5501',
          'formato_ID' => 1001,
          'obj_cuentascontables' => {
                                      'HASH(0xf16eb70)' => undef
                                    }
        };

我不能使用那个'HASH'的东西,所以,我试图看看我是否错误地引用了哈希,并创建了另一个非常相似的哈希。

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返回:

$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'
                                                }
                                    }
        };

我的问题是,为什么?!!! ...我想在我的第一个结构中进行第二次转储...这有可能吗?

3 个答案:

答案 0 :(得分:5)

如果仔细查看如何在第一个片段中构造哈希,则使用花括号{}。在赋值的上下文中,这是为哈希分配哈希引用。

您需要的是圆括号()

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;,因为它会警告你:

Reference found where even-sized list expected ...

答案 1 :(得分:4)

始终使用use strict; use warnings;!后者会发现错误。

$ perl -e'use strict; use warnings; my %obj_cuentascontables = { };'
Reference found where even-sized list expected at -e line 1.

当您希望将标量列表用作键和值时,您正在为列表分配哈希引用。请记住

{ ... }

大致是

do { my %anon = ( ... ); \%anon }

所以

my %obj_cuentascontables = { ... };

应该是

my %obj_cuentascontables = ( ... );

答案 2 :(得分:0)

你没有使用use warnings;这会帮助你看到奇数错误。

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

$param{obj_cuentascontables}->{4210}->{banderamayor}

的值为true

您需要为%obj_cuentascontables哈希分配引用,以获取obj_cuentascontables哈希中%param密钥的值。

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

我的偏好是在引用引用时使用->语法。官方说来,这些都是一样的:

$param{obj_cuentascontables}->{4210}->{banderamayor}
$param{obj_cuentascontables}{4210}{banderamayor}

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

你所做的与此类似:

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}分配了一个哈希引用,这是您想要的,但您之后使用哈希的地址作为键,没有值。