将coderef传递给sort()问题

时间:2019-02-05 04:50:27

标签: perl coderef

使用以下代码段,我得到的结果截然不同。

$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编写了代码,所以我知道它是相同的。

有任何提示/线索吗?我正在尝试将代码移入哈希(它在其中运行...很奇怪)。

谢谢。

-Erik

1 个答案:

答案 0 :(得分:1)

使用sort BLOCK LIST调用约定时,该块应返回一个值,该值指示$a$b的比较方式。但是,您的排序比较块返回一个代码ref($sortFunc{"date"})。您可能还用过

 sort { 1 } @$rec;

替换

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

使用

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