Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl哈希引用即使在取消引用后也会导致错误_Perl_Hash_Reference - Fatal编程技术网

Perl哈希引用即使在取消引用后也会导致错误

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

我有一段代码,使用了60K次之后,它在数据上失败,这与所有其他调用类似。我收到一条“不是散列引用”的消息。代码如下所示:

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次,我错过了对该类生成的引用的引用,该类现在正在使用例程。