Perl陣列排序

2021-06-21 15:25:10 字數 2422 閱讀 7402

本文我們學習如何用perl對字串或者數字陣列進行排序

perl有個內建函式叫做sort毫無疑問的可以排序乙個陣列。 其最簡單的形式是傳遞乙個陣列,它會返回排序後的元素組成的陣列。@sorted = sort @original。

#!/usr/bin/perl

usestrict

;use

warnings

;use

5.010

;use

data

::dumperqw(

dumper

);my

@words=qw

(foo bar zorg moo

);say

dumper

\@words;my

@sorted_words

=sort

@words

;say

dumper

\@sorted_words

;

上邊的例子將會列印

$var1 =[

'foo'

,'bar'

,'zorg'

,'moo'

];$var1 =[

'bar'

,'foo'

,'moo'

,'zorg'

];

第乙個輸出顯示了排序前的陣列,第二個是排序後的。

這是最簡單的情形,但是可能未必是你想要的。 比如,如果一些單詞以大寫字母開頭怎麼辦?

my

@words=qw

(foo bar

zorg

moo);

@sorted_names裡的結果將是:

$var1 =[

'zorg'

,'bar'

,'foo'

,'moo'

];

你會發現,以大寫字母開頭的單詞排在了第一位。 這是因為sort預設根據ascii碼表排序,所有的大寫字母都排在小寫字母前邊。

perl的sort的工作方式是這樣的,它遍歷原始陣列的每兩個元素;每次把左邊的值放入變數$a,把右邊的值放入變數$b。 然後呼叫比較函式。如果$a的內容應該在左邊的話,「比較函式」會返回1;如果$b應該在左邊的話,返回-1,兩者一樣的話,返回0。

通常你看不到比較函式,sort會根據ascii碼表對值進行比較,不過如果你想的話,你可以顯式的寫出來:

sort 

@words

;

這段**會跟沒有使用塊的sort @words達到同樣的效果。

這裡你可以看到,預設perl使用cmp作為比較函式。這是因為正是cmp可以做這裡邊我們需要的工作。 它比較兩邊的字串的值,如果左邊引數「小於」右邊引數,就返回1;如果左邊引數「大於」右邊引數,就返回-1;如果相等,就返回0。

如果你想忽略字串的大小寫來排序——即通常所謂的字母序,你可以像下乙個例子這麼做:

my

@sorted_words

=sort

@words

;

這裡為了比較,我們呼叫lc函式返回引數的小寫版本。然後cmp比較這些小寫版本並決定原始字串誰先誰後。

結果是

$var1 =[

'bar'

,'foo'

,'moo'

,'zorg'

];

如果對數值陣列使用sort進行預設的排序,結果可能不是我們期望的。

my

@numbers=(

14,3,

12,2,

23);

my@sorted_numbers

=sort

@numbers

;say

dumper

\@sorted_numbers

;

$var1 =[

12,14,

2,23,

3];

仔細一想的話,這並不奇怪。比較函式看到12和3時,它按字串進行比較。這意味著比較兩個字串的第乙個字元"1"和"3"。 在ascii碼表裡,"1"在"3"前邊,因此字串"12"會排在字串"3"前面。

perl不會很神奇地猜到你想按數字對這些值排序。

儘管我們可以寫乙個比較函式來按數字比較兩個值。但這裡我們使用<=>(也被稱作宇宙飛船操作符), 它會按數字來比較兩個引數並返回1、-1或者0。

my

@sorted_numbers

=sort

@numbers

;

結果是:

$var1 =[

2,3,

12,14,

23];

perl高階排序

perl 的高階排序手段 語法 my sorted array sort sub sort method original array 這裡的 sub sort method 就是我們制定的排序策略,一般是乙個sub routine 的名字,或者其 示例 my result sort by numb...

perl高階排序

perl 的高階排序手段 語法 my sorted array sort sub sort method original array 這裡的 sub sort method 就是我們制定的排序策略,一般是乙個sub routine 的名字,或者其 示例 my result sort by numb...

Perl入門(三)Perl的陣列

perl陣列的宣告方式 perl使用 符號宣告乙個陣列 array 使用 或 qw 宣告陣列中元素 乙個完整的宣告方式為 array 12,123 abc var 方法一 或者 array qw 12 123 abc 方法二 或者 array 1.10 方法三 perl陣列的訪問 陣列通過下標進行訪...