Ссылка на Perl Hash вызывает ошибку даже после разыменования - PullRequest
0 голосов
/ 08 января 2012

У меня есть фрагмент кода, который используется 60K раз, прежде чем он не сработает на данных, которые похожи на все другие вызовы. Я получаю сообщение «Не ссылка на HASH». Код выглядит так:

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' => '...'
       }

Спасибо за вашу помощь и предложения.

1 Ответ

3 голосов
/ 08 января 2012

Похоже, $ 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';
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...