1

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

$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编辑了代码,所以我知道它是一样的。

任何提示/线索?我正在尝试将代码移动到哈希中(它运行的地方......奇怪)。

谢谢。

-埃里克

4

1 回答 1

1

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

 sort { 1 } @$rec;

代替

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

 sort { $sortFunc{date}->() } @$rec;
于 2019-02-05T05:11:00.140 回答