簡體   English   中英

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

[英]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 } @_;

這是 Perl 常見問題解答。 從命令行:

perldoc -q sort

perlfaq4:如何按(任何)對數組進行排序?

@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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM