my @unsortedArray = { ["Harry", 10], ["Tim", 8], ["Joe", 3]};
my @sortedArray = ?????
最終sortedArray應當基於COL-2(整數),照顧1對1的關係的排序與「人的名字」(col-1)。最終的結果應該是這樣的:
sortedArray should be { ["Joe", 3], ["Tim", 8], ["Harry", 10] };
my @unsortedArray = { ["Harry", 10], ["Tim", 8], ["Joe", 3]};
my @sortedArray = ?????
最終sortedArray應當基於COL-2(整數),照顧1對1的關係的排序與「人的名字」(col-1)。最終的結果應該是這樣的:
sortedArray should be { ["Joe", 3], ["Tim", 8], ["Harry", 10] };
你可以給一個謂詞sort
,那就是:這是評價比較列表的元素的功能。
my @unsorted = (["Harry", 10], ["Tim", 8], ["Joe", 3]);
my @sorted = sort { $a->[1] <=> $b->[1] } @unsorted;
在謂詞(在大括號中的表達式),並且$a
是$b
被比較的外列表中的元素。
sort
只關心一維列表,所以它不會混淆外部列表元素的內部結構。所以姓名和號碼之間的關係可以毫不費力地保留下來。
有關更多詳細信息,請參閱perldoc -f sort
和perldoc perlop
。
一種更有效的解決方案,尤其是對於較大的陣列,可以是使用List::UtilsBy::nsort_by
:
use List::UtilsBy qw(nsort_by);
my @unsorted = (["Harry", 10], ["Tim", 8], ["Joe", 3]);
my @sorted = nsort_by { $_->[1] } @unsorted;
儘管在小的情況下的開銷可能不會被注意到,對於更復雜的功能O(n log n)
密鑰提取成本變更高,並且更優選的是提取每個值的「分類鍵」僅一次,這是nsort_by
所做的。
另請參閱:[Sort :: Key](http://p3rl.org/Sort::Key) – daxim 2012-04-25 21:38:44
'@array = {...}'(幾乎總是)不正確的語法。使用'@array =(...)'分配給一個數組。 – mob 2012-04-25 15:09:20
@mob:我想知道當你提到幾乎*時你有什麼邊緣情況?:) – Zaid 2012-04-25 16:08:27
@Zaid:'@array_containing_a_single_hashref = {...}' – mob 2012-04-25 16:10:41