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