[英]How to sort numbers in Perl
print "@_\n";
4109 4121 6823 12967 12971 14003 20186
我如何在 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章偷來的解決方案(買本書——值得!)
為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)
。 上面使用的<=>
是數值比較運算符。
默認情況下,Perl 的sort
以 ASCII 順序按字母順序排序。 要按數字排序,您可以使用:
@sorted = sort { $a <=> $b } @_;
@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 }
您可以預定義一個函數,該函數應該用於比較數組中的值。
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;
您在這里(以及在許多其他地方)發現對數值數組進行排序的方法是:
@sorted_array = sort { $a <=> $b } @unsorted_array;
現在你嘗試一下,你會得到一個錯誤:“不能在排序比較中使用“我的 $a””! (這是因為您已經使用 'strict.pm' 聲明了 '$a')。 但是,您也不能使用未聲明的變量,因為它們將被視為未定義而被拒絕! 因此,您可能會感到陷入僵局。
perldoc.perl.org和大多數其他地方都沒有提到 '$a'和'$b'是為此用途保留的(令牌) ! (當然,當使用 'strict' 時,應該使用哪個。這很瘋狂,因為 'a' 和 'b' 是編程中最常用的短變量之一,從邏輯上講也是如此!)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.