我正在创建这个散列
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;然后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'
}
}
};我的问题是,为什么?我要在我的第一个建筑里的第二个垃圾场.有可能吗?
发布于 2014-02-25 15:14:39
永远使用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 = ( ... );发布于 2014-02-25 15:13:14
如果仔细研究如何在第一个片段中构造哈希,就会使用大括号{}。在赋值上下文中,这是将哈希引用分配给哈希。
您需要的是圆括号()
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 ...发布于 2014-02-25 16:47:42
您没有使用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}分配了一个散列引用,这正是您想要的,但是您随后使用哈希地址作为键,而不使用任何值。
https://stackoverflow.com/questions/22018240
复制相似问题