用于排序的Perl内联子例程和条件运算符
因此,我有以下代码可以工作:用于排序的Perl内联子例程和条件运算符,perl,Perl,因此,我有以下代码可以工作: my $cmp; if ( $action eq DEL ) { $cmp = \&cmpb;
my $cmp;
if ( $action eq DEL ) {
$cmp = \&cmpb;
}
else {
$cmp = \&cmpf;
}
foreach my $x ( sort $cmp keys %y ) {
# do something
}
这里的cmpb和cmpf是:
sub cmpf { $a cmp $b }
sub cmpb { $b cmp $a }
现在我的问题是,我更喜欢这样:
foreach my $x ( sort $action eq DEL ? \&cmpb : \&cmpf keys %y ) {
# do something
}
或者更好:
foreach my $x ( sort $action eq DEL ? { $a cmp $b } : { $b cmp $a } keys %y ) {
# do something
}
所以有两个问题。首先,让这些函数内联的正确方法是什么,其次,为什么上面的操作不起作用?您可以将三元运算符放在
排序
函数中
foreach my $x ( sort {$action eq DEL ? $a cmp $b : $b cmp $a ;} keys %y ) {
# do something
}
这里有一个链接到上的文档。您可以在{}
中放置所需的任何函数
@伊斯特指出这会更快 由于排序的基本类型(升序、降序、数字 升序、数字降序)优化为不实际调用 用于比较的perl代码。 -伊斯特的评论 也考虑
foreach my $x ($action eq DEL ? reverse sort keys %y : sort keys %y) {
它非常紧凑,可读性也很强。Perl通过反转所有比较来优化
反向排序
;它不会将列表按一种方式排序,然后将其反转。尝试foreach my$x(排序{$action eq“DEL”?$a cmp$b:$b cmp$a;}键%y){#做点什么}
谢谢(删除引号,因为DEL是常量)。当我试图将一个或另一个函数传递给sort函数时,为什么三元运算符不能工作?在任何情况下,请随意添加它作为解决方案,我会接受它。@DavidMokonBond。在一些地方,您可能希望能够有效地给出一个返回标量的任意复杂表达式,但实际上它只接受普通标量变量。这是其中之一,;print
和friends的filehandle参数是另一个。(还有更多。)如果要对非常大的散列进行排序,这将更快:foreach my$x($action eq DEL?sort{$b cmp$a}键%y:sort{$a cmp$b}键%y)
因为排序的基本类型(升序、降序、数值升序、数值降序)优化为不实际调用perl代码进行比较。@窥视孔优化器是否实际识别这些?这对我来说是个好消息,但也是个好消息。我认为sort@things
比sort{$a cmp$b}@things
快得多。
foreach my $x ($action eq DEL ? reverse sort keys %y : sort keys %y) {