1

我在使用子例程时遇到了一些问题,即用于对数字数组进行排序的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("$_ ");
}

我完全理解的例子。这很有意义,但我认为这主要是由于编码:

#!/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";
    }
}

如果有人可以澄清,非常感谢。

4

2 回答 2

9

您的第二个示例不进行任何排序。

为了回答“它如何以数字方式对它们进行排序 - 实际过程? ”,Perl 在内部使用合并排序算法实现排序(在 Perl 5.6 之前是快速排序)。

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

这就是自定义排序子例程的用武之地——它回答排序算法的“哪个数字更大”的问题(或者,更具体地说,一个数字是否小于或等于另一个数字)。

这种实现方式,Perlsort将在内部调用“比较器”函数,并传递给它 2 个参数(通过别名$a$b);如果第一个小于、等于或大于第二个,则期望函数返回负数、零或正数。

于 2011-03-14T14:54:42.697 回答
4

<=>是一个数值运算符。当您比较$a <=> $b时,它将返回 -1、0 或 1,具体取决于左参数在数值上是否小于、等于或大于右参数。

sort函数成对比较列表的元素,因此它需要一个带有两个参数的比较函数(二元运算符)。Sort不断比较对并重新排列它们,直到每个项目都比列表中的下一个项目“更大”。

于 2011-03-14T14:54:59.483 回答