print "@_\n";
4109 4121 6823 12967 12971 14003 20186
如何在Perl中對它進行排序?如何在Perl中對數字進行排序?
使用@sorted = sort(@_);
給了我一個字母排序
13041 13045 14003 20186 4109 4121 6823
我如何獲得一個數字排序? Perl是否具有合併排序,插入排序等內置函數?
print "@_\n";
4109 4121 6823 12967 12971 14003 20186
如何在Perl中對它進行排序?如何在Perl中對數字進行排序?
使用@sorted = sort(@_);
給了我一個字母排序
13041 13045 14003 20186 4109 4121 6823
我如何獲得一個數字排序? Perl是否具有合併排序,插入排序等內置函數?
您可以將自定義比較函數傳遞給Perl的排序例程。只需使用:
@sorted = sort { $a <=> $b } @unsorted;
的sort
函數接受自定義比較函數作爲第一個參數,在一個碼塊的形式。 {...}
部分就是這個代碼塊(參見http://perldoc.perl.org/functions/sort.html)。
sort
只要需要比較要排序的數組中的兩個元素,就會調用此自定義比較函數。 sort
總是通過這兩個值來比較爲$a
,$b
,並且比較函數必須返回比較結果。在這種情況下,它只是使用運算符進行數字比較(請參閱http://perldoc.perl.org/perlop.html#Equality-Operators),它可能是爲此目的而創建的:-)。
解決方案從「Perl Cookbook」無恥地竊取,第04次第15章(買的書 - 這是值得的)
您可以預先定義應該用於比較數組中數值的函數。 perldoc -f sort
給你一個例子:
# sort using explicit subroutine name
sub byage {
$age{$a} <=> $age{$b}; # presuming numeric
}
@sortedclass = sort byage @class;
<=>
運算符用於數字排序。
@sorted = sort {$a <=> $b} @unsorted;
供應比較功能sort()
:
# sort numerically ascending
my @articles = sort {$a <=> $b} @files;
# sort numerically descending
my @articles = sort {$b <=> $a} @files;
默認的排序功能是cmp
,字符串比較,這將排序(1, 2, 10)
爲(1, 10, 2)
。上面使用的<=>
是數值比較運算符。
@l = (4109, 4121, 6823, 12967, 12971, 14003, 20186, 1, 3, 4);
@l = sort { $a <=> $b } @l;
print "@l\n"; # 1 3 4 4109 4121 6823 12967 12971 14003 20186
您必須提供自己的排序子程序{ $a <=> $b }
我只是想救的人,新的在Perl(像我)了很多時間誰擁有這個問題,即如何排序數字數組,因爲我不僅失去了時間,而且讓我瘋狂!
所以,你在這裏找到(在很多其他地方),要排序數字數組的方式是:
@sorted_array = sort { $a <=> $b } @unsorted_array;
現在你試試吧,你會得到一個錯誤:「不能使用「我的$ a」進行排序比較「! (這是因爲您已經使用'strict.pm'聲明'$ a')。但是,那麼你不能使用非聲明變量,因爲它們將被拒絕爲undefined!所以,你可能會像我一樣陷入僵局。
我不得不解決這個問題「困難的方式」,因爲沒有人關心 - 無論是在這裏,還是在perldoc.perl.org,或在我訪問的任何其他地方 - 提及'$ 'AND'$ b'爲此使用保留(代幣)! (這當然是當用'嚴格',哪一個應該,哪一個很瘋狂,因爲'a'和'b'是編程中使用的最常見的短變量,並且在邏輯上是這樣的)
I希望這會對很多程序員有幫助,這些程序員都是Perl中的新成員,他們將訪問此頁面!
順便說一句,你知道perldoc命令嗎? – 2010-08-26 10:57:01
@eugene y:不,我沒有。我現在知道了。謝謝! – Lazer 2010-08-26 11:01:27