Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用于排序的Perl内联子例程和条件运算符_Perl - Fatal编程技术网

用于排序的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) {