所以我有以下代码可以使用:
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
}
所以有两个问题。首先,将这些函数内联的正确方法是什么,其次,为什么不进行上述工作?
答案 0 :(得分:5)
还要考虑
foreach my $x ($action eq DEL ? reverse sort keys %y : sort keys %y) {
非常紧凑,非常易读。 Perl通过反转所有比较来优化reverse sort
;它不会对列表进行单向排序,然后将其反转。
答案 1 :(得分:1)
您可以将三元运算符放在sort
函数中。
foreach my $x ( sort {$action eq DEL ? $a cmp $b : $b cmp $a ;} keys %y ) {
# do something
}
以下是sort上文档的链接。您可以在{ }
。
@ysth指出这会更快
因为排序的基本类型(升序,降序,数字 升序,数字降序)被优化为不实际调用 用于比较的perl代码。 - ysth的评论
foreach my $x ( $action eq DEL ? sort { $b cmp $a } keys %y : sort { $a cmp $b } keys %y )