Передача кода для решения проблем sort () - PullRequest
0 голосов
/ 05 февраля 2019

Используя следующие фрагменты кода, я получаю совершенно разные результаты.

$val{"ENOTE"} = 05;
$val{"WATCH"} = 10;

my %sortFunc = ();

my $sortFunc = sub {
    my ($va, $vb);

    $va = $val{$$a{"etype"} . ":" . $$a{"emsg"}} // $val{$$a{"etype"}};
    $vb = $val{$$b{"etype"} . ":" . $$b{"emsg"}} // $val{$$b{"etype"}};

    #    printf("$$a{etype} gets $va\n");

    $$a{"year"} <=> $$b{"year"}
    || $$a{"month"} <=> $$b{"month"}
    || $$a{"day"} <=> $$b{"day"}
    || $$a{"sym"} cmp $$b{"sym"}
    || $va <=> $vb;
};

$sortFunc{"date"} = sub {
    my ($va, $vb);

    $va = $val{$$a{"etype"} . ":" . $$a{"emsg"}} // $val{$$a{"etype"}};
    $vb = $val{$$b{"etype"} . ":" . $$b{"emsg"}} // $val{$$b{"etype"}};

    #    printf("$$a{etype} gets $va\n");

    $$a{"year"} <=> $$b{"year"}
    || $$a{"month"} <=> $$b{"month"}
    || $$a{"day"} <=> $$b{"day"}
    || $$a{"sym"} cmp $$b{"sym"}
    || $va <=> $vb;
};

Когда я их вызываю, я получаю совершенно разные результаты.

@newsortrec = sort $sortFunc (@$rec);
@newsortrec = sort {$sortFunc{"date"}} (@$rec);

Вызов $sortFunc работает, как я ожидал, и я проверил его вывод.Вывод {$sortFunc{"date"}} действительно странный.Это не бред, как вы ожидаете, если он получил плохие данные или испортил плохой код.Это просто отсортировано в неправильном порядке.Он изменился и «отсортирован», но действительно странным образом.

Есть ли что-то в таинственных $a и $b, которые вызывают у меня горе?

Тот факт, что они(глупо) называть $sortFunc не должно быть проблемой, не так ли?По крайней мере, что касается perl .

Есть ли что-то другое в правилах определения области действия для $a и $b?

У меня diffЯ знал, что код тот же.

Есть подсказки?Я пытаюсь переместить код в хеш (где он работает ... странно).

Спасибо.

-Эрик

1 Ответ

0 голосов
/ 05 февраля 2019

При использовании соглашения о вызовах sort BLOCK LIST блок должен возвращать значение, которое указывает, как $a сравнивается с $b.Однако ваш блок сравнения сортировки возвращает код ref ($sortFunc{"date"}).Вы могли бы также использовать

 sort { 1 } @$rec;

Заменить

 sort { $sortFunc{date} } @$rec;

на

 sort { $sortFunc{date}->() } @$rec;
...