【问题标题】:Bad index while coercing array into hash in Perl在 Perl 中将数组强制转换为哈希时索引错误
【发布时间】:2014-08-25 20:38:17
【问题描述】:

下面是代码

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 的新手。有人可以指出我犯的错误吗?

【问题讨论】:

  • $session 来自哪里?

标签: perl


【解决方案1】:

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

在某些地方你使用它就像一个数组引用:

scalar @{$results}

在其他地方,您像哈希引用一样使用它:

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

不可能两者兼有(至少在没有一些沉重的overload 魔法的情况下不会)。

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

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

    $a-&gt;{epoch_received_date} cmp $b-&gt;{epoch_retrieve_data}

并不是
    $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
}

【讨论】:

  • 进行上述更改后,我收到以下错误,键的 arg 1 类型必须是哈希(而不是数组取消引用)...
  • @carkct - 再次阅读建议。我怀疑是否有必要使用keys。我猜你应该使用sort {...} @{$results}
  • 保持你的下巴。这东西很复杂,很混乱,但是一旦你掌握了它,它就会非常强大和富有表现力。
  • 我尝试使用 foreach my $row(sort { {$b}->{epoch_received_date} cmp {$a}->{epoch_received_date} } @{$results} ) 并且成功了。谢谢。
  • @ikegami - 我认为摘要代码中有错误(next if @$results 似乎与 OP 的代码相反)
猜你喜欢
  • 2014-06-25
  • 2010-09-29
  • 1970-01-01
  • 1970-01-01
  • 2017-01-06
  • 1970-01-01
  • 2011-02-23
  • 2014-07-23
  • 2019-10-27
相关资源
最近更新 更多