2012-01-08 14 views
0

他のすべての呼び出しに似たデータに失敗する前に60K回使用されるコードがあります。 「ハッシュリファレンスではない」というメッセージが表示されます。コードは次のようになります。コードが例外を見逆参照の後でもPerlハッシュリファレンスでエラーが発生する

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

はあなたの助けと提案いただきありがとうございます:私は次の出力を取得します。

答えて

3

$ 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'; 
+0

ありがとうございました。参考文献への参照を示すきれいな説明。コードが60K回呼ばれたと言ったとき、間違っていました。多相クラスから60K回呼ばれていましたが、現在ルーチンを使用していたクラスによって生成された参照への参照がありませんでした。 –

関連する問題