2012-01-13 60 views
0

下面是代码为索引,而强迫阵列分成散列在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。有人可以指出我犯的错误吗?

+0

哪里是'$ session'来自哪里? – geoffspear 2012-01-13 17:31:52

+0

哪一行代码会产生错误? – toolic 2012-01-13 17:34:21

+0

你使用的是什么版本的Perl? 'perl -v'。 'perldoc perldiag'中找不到此消息。 – toolic 2012-01-13 17:38:01

回答

3

$results散列引用还是数组引用?

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

scalar @{$results} 

而在其他地方,你正在使用它像一个散列引用:

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

它不能同时(至少不是没有一些重的overload魔术)。

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

  1. 使用@{$results}是正确的;此表达式是“散列引用数组”
  2. sort的最后一个参数应该是一个列表,但要传递的正确列表是@{$results}而不是keys %{$results}
  3. 然后参数$a$b里面的sort函数将会是@{$results}的成员,也就是它们会被哈希引用。因此,为了使比较

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

而不是

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

一起:

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

进行上述更改后,我得到以下错误,键的参数1的类型必须是散列(不是数组引用)... – carkct 2012-01-13 17:56:55

+0

@carkct - 再次阅读这些建议。我怀疑是否有必要使用'keys'。我猜你应该使用'sort {...} @ {$ results}'。 – mob 2012-01-13 18:05:36

+0

并保持你的下巴。这些东西很复杂而且令人困惑,但一旦掌握了它,它就非常强大和富有表现力。 – mob 2012-01-13 18:08:38