2010-08-26 41 views
19
print "@_\n"; 
4109 4121 6823 12967 12971 14003 20186 

如何在Perl中對它進行排序?如何在Perl中對數字進行排序?

使用@sorted = sort(@_);給了我一個字母排序

13041 13045 14003 20186 4109 4121 6823 

我如何獲得一個數字排序? Perl是否具有合併排序,插入排序等內置函數?

+0

順便說一句,你知道perldoc命令嗎? – 2010-08-26 10:57:01

+0

@eugene y:不,我沒有。我現在知道了。謝謝! – Lazer 2010-08-26 11:01:27

回答

42

您可以將自定義比較函數傳遞給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章(買的書 - 這是值得的)

+1

我會把這個鏈接下來,它沒有持有人的同意分發版權材料。您可以推薦原作(Perl Cookbook,Christiansen和Torkington)。 – 2010-08-26 15:33:26

+0

這似乎是[Perl]標籤上的一個共識,即鏈接到O'Reilly書籍(或任何書籍)的盜版副本是壞的。編輯刪除 – DVK 2010-08-26 17:36:16

+0

對不起,沒有意識到鏈接是盜版材料。感謝您修復它。 – sleske 2010-08-26 23:59:47

2

您可以預先定義應該用於比較數組中數值的函數。 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; 
7

默認情況下,Perl的sort按ASCII碼順序按字母順序排序。要排序數字,您可以使用:

@sorted = sort { $a <=> $b } @_; 
+0

這是如何工作的? – Lazer 2010-08-26 10:53:35

+0

@拉澤爾:看我的解釋(我提交了同樣的答案,稍後;-))。 – sleske 2010-08-26 10:55:25

8

供應比較功能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)。上面使用的<=>是數值比較運算符。

4
@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 }

0

我只是想救的人,新的在Perl(像我)了很多時間誰擁有這個問題,即如何排序數字數組,因爲我不僅失去了時間,而且讓我瘋狂!

所以,你在這裏找到(在很多其他地方),要排序數字數組的方式是:

@sorted_array = sort { $a <=> $b } @unsorted_array; 

現在你試試吧,你會得到一個錯誤:「不能使用「我的$ a」進行排序比較「! (這是因爲您已經使用'strict.pm'聲明'$ a')。但是,那麼你不能使用非聲明變量,因爲它們將被拒絕爲undefined!所以,你可能會像我一樣陷入僵局。

我不得不解決這個問題「困難的方式」,因爲沒有人關心 - 無論是在這裏,還是在perldoc.perl.org,或在我訪問的任何其他地方 - 提及'$ 'AND'$ b'爲此使用保留(代幣)! (這當然是當用'嚴格',哪一個應該,哪一個很瘋狂,因爲'a'和'b'是編程中使用的最常見的短變量,並且在邏輯上是這樣的)

I希望這會對很多程序員有幫助,這些程序員都是Perl中的新成員,他們將訪問此頁面!