Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl 混合哈希无法正常工作_Perl_Hash - Fatal编程技术网

Perl 混合哈希无法正常工作

Perl 混合哈希无法正常工作,perl,hash,Perl,Hash,我正在创建这个散列 my %obj_cuentascontables = { '4210' => { 'banderamayor' => 'true', 'enlace' => 'true', 'not_rlike_nombre' => 'DEVOLUCION' }, '4410' => { 'banderamayor' =

我正在创建这个散列

    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
                                    }
        };
我不能使用“散列”的东西,所以,我试着看看我是否引用了错误的散列,我创建了另一个非常类似的散列

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;
然后转储程序返回以下内容:

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

我的问题是,为什么?!!!。。。我想要在我的第一个结构中的第二个转储。。。有可能吗?

如果您仔细查看第一个代码段中如何构造哈希,您使用了大括号
{}
。在分配的上下文中,这是将哈希引用分配给哈希

您需要的是圆括号
()


这就是为什么您应该
使用警告,因为它会警告您:

Reference found where even-sized list expected ...

如果仔细查看第一个代码段中如何构造哈希,您使用了大括号
{}
。在分配的上下文中,这是将哈希引用分配给哈希

您需要的是圆括号
()


这就是为什么您应该
使用警告,因为它会警告您:

Reference found where even-sized list expected ...

始终使用
严格使用;使用警告!后者会发现错误

$ 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 = ( ... );

始终使用
严格使用;使用警告!后者会发现错误

$ 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 = ( ... );

您没有使用
使用警告这将帮助您看到奇数错误

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

$param{obj_cuentascontables}->{4210}->{banderamayor}
值为
true

对于
%param
散列中的
obj\u cuencatables
键的值,您需要为您的
%obj\u cuencatables
散列分配一个引用

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

您没有使用
使用警告这将帮助您看到奇数错误

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

$param{obj_cuentascontables}->{4210}->{banderamayor}
值为
true

对于
%param
散列中的
obj\u cuencatables
键的值,您需要为您的
%obj\u cuencatables
散列分配一个引用

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