Perl内联子例程和条件运算符用于排序

时间:2014-11-13 00:52:47

标签: perl

所以我有以下代码可以使用:

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
}

所以有两个问题。首先,将这些函数内联的正确方法是什么,其次,为什么不进行上述工作?

2 个答案:

答案 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 )
相关问题