在Perl中将数组强制转换为哈希时索引错误

时间:2012-01-13 17:25:07

标签: perl

以下是代码

my $results = $session->array_of_hash_for_cursor("check_if_receipts_exist", 0, @params);
next if( scalar @{$results} <= 0 );
$logger->info("Retrieved number of records: ".scalar @$results);
foreach my $row( sort { $results->{$b}->{epoch_received_date} cmp $results->{$a}->{epoch_received_date} } keys %{$results} )
      {
       //logic
      }

'check_if_receipts_exists'是一个返回一些结果的SQL查询。我尝试执行此操作,我收到以下错误, 将数组强制转换为哈希

时的错误索引

我是Perl的新手。有人可以指出我正在犯的错误吗?

1 个答案:

答案 0 :(得分:3)

$results是哈希引用还是数组引用?

在某些地方,您使用它就像数组引用一样:

scalar @{$results}

在其他地方你正在使用它像哈希引用:

$results->{$b}->{...}
keys %{$results}

它不能同时存在(至少没有一些沉重的overload魔法)。

如果我可以从设置$results的函数的名称推断,它应该是对哈希引用列表的引用,那么一些调整将设置正确:

  1. 使用@{$results}是正确的;这个表达式是“一个哈希引用数组”
  2. sort的最后一个参数应该是一个列表,但要传递的正确列表是@{$results},而不是keys %{$results}
  3. 然后$a函数中的参数$bsort将成为@{$results}的成员,也就是说,它们将是哈希引用。所以要做的比较是

      

    $a->{epoch_received_date} cmp $b->{epoch_retrieve_data}

  4.      而不是

        $results->{$a}->{...} cmp $results->{$b}->{...}
    

    所有在一起:

    my $results = $session->array_of_hash_for_cursor(
       "check_if_receipts_exist", 0, @params);
    next if !@$results;
    $logger->info("Retrieved number of records: ".@$results);
    for my $row (
        sort {
            $b->{epoch_received_date}
              cmp
            $a->{epoch_received_date}
        } @$results
    ) {
       # logic
    }