当在子程序中隐含使用时,-1,0,1如何帮助排序函数?

Mik*_*ley 1 arrays sorting perl subroutine

我在使用子程序时遇到了一些麻烦,即用于对数字数组进行排序的sort函数.我知道如果你单独使用sort函数,它会使用ASCII格式进行排序,因为本书描述了这一点,并且排序不是所需的顺序.我知道并且通过使用<=>比较值来了解返回的内容,甚至是cmp为字符串介绍(尽管我还没有使用它).

我不明白的具体是它如何在数字上对它们进行分类 - 实际过程.我理解返回的是什么,但是这本书只是说它返回-1,0和1,而不是具体的数字最终最终排序为1 8 24 72 144 288.

我的例子:

sub sort_by_number {
    return $a <=> $b;
}

@myArray = (1,24,8,144,72,288);

foreach(sort sort_by_number(@myArray)) {
    print("$_ ");
}
Run Code Online (Sandbox Code Playgroud)

我完全理解的例子.它很有道理,但我认为这主要是由于编码:

#!/usr/bin/perl

print("Please enter your name: ");
$name = <STDIN>;
chomp($name);
print("Please enter your age: ");
$age = <STDIN>;
chomp($age);

print(greeting($name, $age));

sub greeting {
    $msg = "Hello $_[0], ";
    determine_age($_[1],$msg);
}

sub determine_age {
    $num = ($_[0] <=> 18);
    if ($num == -1) {
        return "$_[1]you are under 18.($_[0])\n";
    } elsif ($num == 0) {
        return "$_[1]you will be a 19 on your next birthday!\n";
    } else {
        return "$_[1]you are over 18!($_[0])\n";
    }
}
Run Code Online (Sandbox Code Playgroud)

如果有人能澄清,请大力赞赏.

DVK*_*DVK 9

你的第二个例子没有做任何排序.

为了回答" 它是如何对它们进行数字排序 - 实际过程? ",Perl在内部使用Merge Sort算法实现排序(在Perl 5.6之前是快速排序).

该算法本身相当复杂(详见维基),但最终比较2个数字并决定一个是否大于另一个,并根据该决定执行某些操作.如果您对细节感到好奇,那么需要比较的算法部分就是if first(left) ? first(right)Wiki示例中的一行.

这是自定义排序子程序的来源 - 它为排序算法回答"哪个数字更大"的问题(或者更具体地说,一个数字是否小于或等于另一个数字).

实现它的方式,Perl sort将在内部调用"比较器"函数,并传递2个参数(通过别名$a$b); 并且如果第一个小于,等于或大于第二个,则期望函数返回负,零或正.

  • 传递给`sort`的函数可以返回任何负值,零值或正值,而不仅仅是"-1","0"或"1".所以要进行数字排序,你可以说`sort {$ a- $ b} @ numbers_to_sort`.(不是你*应该*说,必然) (4认同)