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

Dav*_*ond 4 perl

所以我有以下代码可行:

my $cmp;                                                                    
if ( $action eq DEL ) {                                                     
    $cmp = \&cmpb;                                                          
}                                                                           
else {                                                                      
    $cmp = \&cmpf;                                                          
}                                                                           

foreach my $x ( sort $cmp keys %y ) {
    # do something
}
Run Code Online (Sandbox Code Playgroud)

这里的cmpb和cmpf是:

sub cmpf { $a cmp $b }                                                          
sub cmpb { $b cmp $a } 
Run Code Online (Sandbox Code Playgroud)

现在我的问题是我宁愿做类似的事情:

foreach my $x ( sort $action eq DEL ? \&cmpb : \&cmpf keys %y ) {
    # do something
}
Run Code Online (Sandbox Code Playgroud)

甚至更好:

foreach my $x ( sort $action eq DEL ? { $a cmp $b } :  { $b cmp $a } keys %y ) {
    # do something
}
Run Code Online (Sandbox Code Playgroud)

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

hob*_*bbs 5

还考虑一下

foreach my $x ($action eq DEL ? reverse sort keys %y : sort keys %y) {
Run Code Online (Sandbox Code Playgroud)

这是非常紧凑和可读的.Perl reverse sort通过反转所有比较来优化; 它不会以一种方式对列表进行排序,然后将其反转.