Perl 将coderef传递给sort()问题

Perl 将coderef传递给sort()问题,perl,coderef,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

使用下面的代码,我得到了完全不同的结果

$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
ed,所以我知道它是一样的

有什么提示/线索吗?我试图将代码移动到散列中(奇怪的是,它在那里运行)

谢谢


-Erik

使用
排序块列表调用约定时,块应返回一个值,该值指示
$a
$b
的比较情况。但是,排序比较块返回一个代码引用(
$sortFunc{“date”}
)。你还不如用

 sort { 1 } @$rec;
替换

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


好啊成功了。为什么
$sortFunc
不需要同样的治疗?为什么
$sortFunc{date}
(没有块参数)不能工作(它甚至没有运行)?就尤克斯而言,街区是什么类型的?coderef有时似乎可以工作。无论如何,你的改变是有效的,非常感谢你-ErikIs这样做是因为
$sortFunc
作为coderef在符号表中,而哈希值通常根本不在符号表中?因为它不遵循
排序块列表
调用约定。例如,
sort{$sortFunc}…
将给出与
sort{$sortFunc{date}}…
相同的结果
sort$sortFunc…
与任何有文档记录的调用约定都不匹配,但作为
sort SUBNAME LIST
.Re”工作,仅对于yuks,什么“类型”是块?块是形式“
{STATEMENTS}
”的语法元素,我遗漏了一段代码<代码>$va
$vb
是数字<代码>$val{“ENOTE”}=05。很抱歉给你带来了困惑-E
 sort { $sortFunc{date}->() } @$rec;