我无法访问哈希的元素。我想要访问的元素是一个数组。使用Data :: Dumper转储时,哈希看起来像这样:
$VAR1 = {
#Lots of vars here
'ResponsibleID' => '1',
'DynamicField_AssetMatricole' => [
'2400930 ',
'2901666 ',
'2401940 '
],
'ChangeBy' => '19',
#Lots of other vars here
};
现在,当我尝试访问由“DynamicField_AssetMatricole”标识的嵌套数组时,它在我使用时效果很好:
my $DFname = "DynamicField_AssetMatricole";
$VAR1{$DFname} #WORKS
但实际的密钥来自mysql,并存储在另一个哈希结构中:
$Param{DynamicFieldConfig}->{Name} #this contains "AssetMatricole"
因此我希望可以通过以下方式访问该数组:
$VAR1{'DynamicField_'.$Param{DynamicFieldConfig}->{Name}} #DOES NOT WORK
这不起作用。我们已经进行了一段时间的故障排除,试图理解两个键不匹配的原因:
my $DFname = 'DynamicField_'.$Param{DynamicFieldConfig}->{Name};
my $DFname2 = 'DynamicField_'.'AssetMatricole';
$VAR1{$DFname} # DOES NOT WORK
$VAR1{$DFname2} # WORKS
if ( $DFname eq $DFname2 ) {
print ERRLOG "STRING MATCH!\n";
} else {
print ERRLOG "STRING DON'T MATCH!\n";
}
...这实际上打印出“STRING MATCH”
进一步调查:(使用http://metacpan.org/pod/Data::HexDump)
use Data::HexDump;
my $DFname = 'DynamicField_'.$Param{DynamicFieldConfig}->{Name};
my $DFname2 = 'DynamicField_'.'AssetMatricole';
my $hd = new Data::HexDump;
my $hd2 = new Data::HexDump;
$hd->data($DFname);
print ERRLOG $hd->dump;
$hd2->data($DFname2);
print ERRLOG $hd2->dump;
输出:
00000000 44 79 6E 61 6D 69 63 46 - 69 65 6C 64 5F 41 73 73 DynamicField_Ass
00000010 65 74 4D 61 74 72 69 63 - 6F 6C 65 etMatricole
00000000 44 79 6E 61 6D 69 63 46 - 69 65 6C 64 5F 41 73 73 DynamicField_Ass
00000010 65 74 4D 61 74 72 69 63 - 6F 6C 65 etMatricole
意味着两个字符串实际上是相同的!
背景:应用程序正在mod_perl下运行。 Apache和mysql(及其所有dbs和表)都设置为UTF8。
有没有人知道我们可以调查的地方?
提前致谢
答案 0 :(得分:0)
<强>更新强>
科普托说:我使用严格;使用警告;在脚本中定义,我实际上只有当我尝试使用 - &gt;访问元素时才会得到错误(如全局符号“%v”需要明确的包名称),如下所示:$ VAR1-&gt; {
%VAR1是真正的哈希值,%Param是哈希引用。
然后尝试
$VAR1{'DynamicField_'.$Param->{DynamicFieldConfig}{Name}}
请注意->
之后的$Param
,因为它不是哈希值,而是对哈希值的引用!
我尝试了以下步骤:
#!/usr/bin/perl
use strict;
use warnings;
my %v = ( X_Y => [ 1, 2, 3 ]);
my $Prm = { test => { Name => "Y" }};
print exists $v{X_Y} ? "found\n" : "none\n";
print "*", $Prm->{test}, "\n";
print "*", $Prm->{test}->{Name}, "\n";
print "*", $Prm->{test}{Name}, "\n";
print "*", $v{"X_".$Prm->{test}->{Name}}, "\n";
print "*", $v{"X_".$Prm->{test}{Name}}, "\n";
print "*", $v{X_Y}, "\n";
输出:
found
*HASH(0x8006c020)
*Y
*Y
*ARRAY(0x8002bd08)
*ARRAY(0x8002bd08)
*ARRAY(0x8002bd08)
最后我理解了这个问题!我总是在脚本的开头定义use strict; use warnings;
。所以我不明白为什么在使用$Prm{X_Y}
时没有错误消息。它是自动定义的!
启动这样的perl代码:
#!/usr/bin/perl
use strict;
use warnings;
并且您将收到许多错误消息:
Global symbol "%Prm" requires explicit package name at ./q.pl line 11.
因为只定义了$ Prm哈希引用!
科普托说:接下来我要做的是引用该数组并将值放在另一个哈希中:my%TicketValues; %TicketValues = map {$ _ =&gt; $ } $ LinkTicketInfo {'DynamicField '。$ Param {DynamicFieldConfig} {Name}}
尝试:
my %TicketValues = map {$_ => $_} @{$LinkTicketInfo{'DynamicField_'.$Param->{DynamicFieldConfig}{Name}}};