Perl “需要澄清错误”;Can';t使用字符串(“package”)作为散列引用,而;严格参考;

Perl “需要澄清错误”;Can';t使用字符串(“package”)作为散列引用,而;严格参考;,perl,Perl,这是我的密码 my $hash1 = $hash0->{unknown}{unknown}; while ( my ( $var, $hash2 ) = each %$hash1 ) { ... } 当我试图从下面的散列访问my$hash1=$hash0->{unknown}{unknown}时,我遇到了一个错误,无法使用字符串(“package”)作为散列引用,而使用“strict refs” print Dumper $hash0; $VAR1 = bless( {

这是我的密码

my $hash1 = $hash0->{unknown}{unknown};
while ( my ( $var, $hash2 ) = each %$hash1 ) {
    ...
}
当我试图从下面的散列访问
my$hash1=$hash0->{unknown}{unknown}
时,我遇到了一个错误
,无法使用字符串(“package”)作为散列引用,而使用“strict refs”

print Dumper $hash0;

$VAR1 = 
bless( {
    'branch' => bless( {
         'lib/sample/sp.pm' => bless( {
             'branch' => bless( {
                 'lib/sample/sp.pm'=>     bless( {
                     'sample::sp' => '1'
                 }, 'DBM::Deep::Hash' )
             }, 'DBM::Deep::Hash' ),
         'branch' => $VAR1->{'branch'}{'lib/sample/sp.pm'}{'branch'}
         }, 'DBM::Deep::Hash' )
                     }, 'DBM::Deep::Hash' ),
'main' => bless( {}, 'DBM::Deep::Hash' ),
'main' => $VAR1->{'main'}
}, 'DBM::Deep::Hash' );
我浏览了很多论坛,我对这个错误的理解是,当
$hash->{unknown}{unknown}
有一个字符串而不是hash时,我会遇到这个错误(我在代码的下一步中取消引用
$hash1
)。但是我在散列中没有看到任何字符串值('package'如错误消息中所示),但它仍然会抱怨


有人能帮我理解这个问题吗。

你的例子没有提到
使用严格的
。在
strict
生效时,根据您的代码,
$hash1
是未定义的,因此不能强制为哈希。一种选择是使用
each%{$hash1 | |{}
,如果您必须这样编码。

在错误消息中显示
,但在转储程序输出中不显示的几率实际上为零;也许你需要转储另一个变量;也许可以尝试
使用Carp::Always
dumped hash将键
main
显示两次。你确定你复制的“粘贴”正确吗?正确复制了散列,不知道是否看到了重复的键。哪个DBM::Deep版本?这看起来像是一个很棘手的问题,具有深度自引用和重复键散列,我希望解决方案能揭示一些有趣的东西@sunil:严格引用错误发生在哪一行,是我的声明行还是while()行?另外,您能给我们提供更多的上下文吗?$hash0应该是DBM::Deep::Hash的对象吗?它是如何创建的?谢谢。我会尝试一下并让你知道。