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)
如果有人能澄清,请大力赞赏.
你的第二个例子没有做任何排序.
为了回答" 它是如何对它们进行数字排序 - 实际过程? ",Perl在内部使用Merge Sort算法实现排序(在Perl 5.6之前是快速排序).
该算法本身相当复杂(详见维基),但最终比较2个数字并决定一个是否大于另一个,并根据该决定执行某些操作.如果您对细节感到好奇,那么需要比较的算法部分就是if first(left) ? first(right)Wiki示例中的一行.
这是自定义排序子程序的来源 - 它为排序算法回答"哪个数字更大"的问题(或者更具体地说,一个数字是否小于或等于另一个数字).
实现它的方式,Perl sort将在内部调用"比较器"函数,并传递2个参数(通过别名$a和$b); 并且如果第一个小于,等于或大于第二个,则期望函数返回负,零或正.
| 归档时间: |
|
| 查看次数: |
142 次 |
| 最近记录: |