Неверный индекс при приведении массива в хеш в Perl - PullRequest
0 голосов
/ 13 января 2012

Ниже приведен код

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-запрос, который возвращает некоторые результаты.Что я пытаюсь выполнить это, я получаю следующую ошибку, Bad index при приведении массива в хеш

Я новичок в Perl.Может кто-нибудь указать на ошибку, которую я совершаю?

1 Ответ

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

Является ли $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 !@$results;
$logger->info("Retrieved number of records: ".@$results);
for my $row (
    sort {
        $b->{epoch_received_date}
          cmp
        $a->{epoch_received_date}
    } @$results
) {
   # logic
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...