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;