Perl哈希引用即使在取消引用后也会导致错误
我有一段代码,使用了60K次之后,它在数据上失败,这与所有其他调用类似。我收到一条“不是散列引用”的消息。代码如下所示:Perl哈希引用即使在取消引用后也会导致错误,perl,hash,reference,Perl,Hash,Reference,我有一段代码,使用了60K次之后,它在数据上失败,这与所有其他调用类似。我收到一条“不是散列引用”的消息。代码如下所示: sub getRowKey { my ($self,$row) = @_; my @keys = split(/,/,$self->{_key}); my $rowkey = ""; confess "Not a non-reference" if ( ! defined( ref( $row ) ) ); confess "n
sub getRowKey
{
my ($self,$row) = @_;
my @keys = split(/,/,$self->{_key});
my $rowkey = "";
confess "Not a non-reference" if ( ! defined( ref( $row ) ) );
confess "no keys found". Dumper($row ) if( scalar(@keys) == 0);
foreach my $k (@keys)
{
try
{
$rowkey .= "," if $rowkey ne "";
$rowkey .= $row->{$k};
}
catch Error with
{
$ex = shift;
print "rowkey = '$rowkey' k = '$k'\n";
print Dumper($ex);
print Dumper($row);
confess "Exception: " . $ex->{-text};
}
;
}
return $rowkey;
}
当代码看到异常时:我得到以下输出:
rowkey = '' k = 'TopicId'
$VAR1 = bless( {
'-file' => 'baseDB.pm',
'-text' => 'Not a HASH reference',
'-line' => '95',
'-package' => 'Error'
}, 'Error::Simple' );
$VAR1 = \{ ## note this is a a reference!
'LastReplyId' => 8563,
'LastPostDate' => '2006-06-21 13:37:48',
'TopicId' => '8563', ## note this is they name/value pair to be accessed
'LastTopicDate' => '2000',
'LastReplyDate' => '2006-06-21 13:37:48',
'ForumId' => '84',
'LastPostData' => '...'
}
感谢您的帮助和建议。看起来$row不是哈希引用,而是对哈希引用的引用。看看这个例子:
use Data::Dumper;
my %h = (a=>1,b=>2);
my $r = \%h;
my $rr = \$r;
print Dumper(%h);
print Dumper($r);
print Dumper($rr);
返回:
$VAR1 = 'a';
$VAR2 = 1;
$VAR3 = 'b';
$VAR4 = 2;
$VAR1 = {
'a' => 1,
'b' => 2
};
$VAR1 = \{
'a' => 1,
'b' => 2
};
对引用的引用看起来像是错误转储中的$VAR1=\{
您可能希望通过修改这一行来尝试捕捉这一点:
confess "Not a non-reference" if ( ! defined( ref( $row ) ) );
而是看起来像:
confess "Not a non-reference" unless ref($row) eq 'HASH';
看起来$row不是哈希引用,而是对哈希引用的引用。请看以下示例:
use Data::Dumper;
my %h = (a=>1,b=>2);
my $r = \%h;
my $rr = \$r;
print Dumper(%h);
print Dumper($r);
print Dumper($rr);
返回:
$VAR1 = 'a';
$VAR2 = 1;
$VAR3 = 'b';
$VAR4 = 2;
$VAR1 = {
'a' => 1,
'b' => 2
};
$VAR1 = \{
'a' => 1,
'b' => 2
};
对引用的引用看起来像是错误转储中的$VAR1=\{
您可能希望通过修改这一行来尝试捕捉这一点:
confess "Not a non-reference" if ( ! defined( ref( $row ) ) );
而是看起来像:
confess "Not a non-reference" unless ref($row) eq 'HASH';
谢谢。非常清晰的解释显示了对引用的引用。当我说代码被调用了60K次时,我错了。它被一个多态类调用了60K次,我错过了对该类生成的引用的引用,该类现在正在使用例程。谢谢。非常清晰的解释显示了对引用的引用当我说代码被调用了60K次时,我错了。它被一个多态类调用了60K次,我错过了对该类生成的引用的引用,该类现在正在使用例程。