Perl-无法访问哈希元素

Perl-无法访问哈希元素,perl,hash,Perl,Hash,我无法访问散列的元素。我要访问的元素是数组。当使用Data::Dumper转储时,哈希如下所示: $VAR1 = { #Lots of vars here 'ResponsibleID' => '1', 'DynamicField_AssetMatricole' => [ '2400930 ',

我无法访问散列的元素。我要访问的元素是数组。当使用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";                                                                 
}  
。。。这实际上打印出“字符串匹配”

进一步调查:(使用)

产出:

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(及其所有数据库和表)设置为UTF8

有人知道我们可以去哪里调查吗


提前感谢

更新

西奥托说:

我有严格的用途;使用警告;在脚本中定义,并且只有当我尝试使用->访问元素时,我才实际得到错误(比如全局符号“%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.
您将收到许多类似以下的错误消息:

#!/usr/bin/perl

use strict;
use warnings;
Global symbol "%Prm" requires explicit package name at ./q.pl line 11.
因为只定义了$Prm哈希引用

西奥托说:

接下来我要做的是引用该数组并将值放入另一个散列:my%TicketValues;%TicketValues=map{$\u=>$}$LinkTicketInfo{'DynamicField'.$Param{DynamicFieldConfig}{Name}

尝试:


你忽略了什么是有效的,什么是无效的!?!并且说它对一些不存在的变量有效?!(
%VAR1
而不是
$VAR1
)如果你甚至不显示产生问题的代码,我们怎么能找到问题呢!
$VAR1{'assetricole'.$Param{DynamicFieldConfig}->{Name}#不起作用
-当然,字符串应该是
DynamicField
。访问神奇变量可能会有问题。请尝试字符串化变量,使其成为出现问题的标量(
“”.$foo->{…}
)@choroba,根据后来的陈述,这似乎是一个拼写错误,但是这篇文章充满了这样的问题,这使得每一个声明都有疑问。@choroba,我更正了拼写错误。谢谢。但是关键应该从
DynamicField
@TrueY开始,是的,我确信它有效,因为它适用于我的案例,
$v{X\u Y}
指的是一个键,由
DynamicField\u AssetMatricole
字符串表示。@user2365717:好的,尝试在
$VAR1
之后添加
->
。它应该可以工作。参见我的示例,您可以看到,
$v{X\u Y}
不返回值,但
$v->{X\u Y}
返回值。@TrueY,
$VAR1->{'DynamicField{DynamicFieldConfig}->{Name}}
是我尝试的第一件事。我将尝试您发布的其他示例。@Scilto:好的,在perl脚本的开头添加
使用严格;使用警告;
!如果使用
$VAR1{…}
,因为没有定义
%VAR1