-1

我无法访问哈希的元素。我要访问的元素是一个数组。当使用 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";                                                                 
}  

...这实际上打印出“字符串匹配”

进一步调查:(使用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。

有没有人知道我们可以在哪里调查?

提前致谢

4

1 回答 1

0

更新

肖尔托说:

我有严格的使用;使用警告;在脚本中定义,并且实际上只有当我尝试使用 -> 访问元素时才会出现错误(例如全局符号“%v”需要显式包名),如下所示:$VAR1->{

%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 哈希引用!

肖尔托说:

我接下来要做的是引用该数组并将值放在另一个哈希中:我的 %TicketValues; %TicketValues = map {$_ => $ } $LinkTicketInfo{'DynamicField '.$Param{DynamicFieldConfig}{Name}}

尝试:

my %TicketValues = map {$_ => $_} @{$LinkTicketInfo{'DynamicField_'.$Param->{DynamicFieldConfig}{Name}}};
于 2013-05-09T10:35:16.487 回答