我正在创建此哈希
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'
}
}
};
我的问题是,为什么?!!! ...我想在我的第一个结构中进行第二次转储...这有可能吗?
答案 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}
分配了一个哈希引用,这是您想要的,但您之后使用哈希的地址作为键,没有值。