2014-10-06 93 views
0

我正在學習perl,並希望對文件中的列進行排序。我在網上找到了這個代碼。有人可以幫助我在列中的列排序代碼

my @array = ( 
    "kyy1   x753y420 31082010 07:01:11", 
    "exr1   x831y444 31082010 07:43:45", 
    "eef1   x717y532 31082010 07:30:17", 
    "bab3   x789y486 31082010 08:08:56", 
    "sam1  x1017y200 31082010 07:25:18", 
    "jmd2   x789y466 31082010 07:38:22", 
    "baa3cqc  x720y440 31082010 07:26:37" 
); 

# Sort by first column - login name 
my @sortedName = sort { (split ' ', $a)[0] cmp (split ' ', $b)[0] } @array; 

# Sort by second column - SKU number 
my @sortedSkno = sort { (split ' ', $a)[1] cmp (split ' ', $b)[1] } @array; 

# Sort by third - date - and fourth - time - column combined! 
my @sortedTime = sort { (split ' ', $a)[2].(split ' ', $a)[3] cmp (split ' ', $b)[2].(split ' ', $b)[3] } @array; 

print "Array\n"; 
print join("\n", @array)."\n\n"; 

print "Sort Name\n"; 
print join("\n", @sortedName)."\n\n"; 

print "Sort Skno\n"; 
print join("\n", @sortedSkno)."\n\n"; 

print "Sort Date\n"; 
print join("\n", @sortedTime)."\n\n"; 

但我不明白以下行完全

# Sort by first column - login name 
my @sortedName = sort { (split ' ', $a)[0] cmp (split ' ', $b)[0] } @array; 

什麼我不明白的是,排序函數有兩個參數(split ' ', $a)[0](split ' ', $b)[0]。這些代表排序功能使用的特殊變量$a$b。如果那是真的,那麼如何在(split ' ', $a)[0]再次分裂功能$a!?

+2

'$ a'和'$ b'對應於數組中的元素。你可以在這裏閱讀它:http://perldoc.perl.org/functions/sort.html – chilemagic 2014-10-06 23:18:43

+0

'$ a'和'$ b'確實是特殊變量,但你可以用各種方式轉換它們 - 例如。將它們拆分並使用結果數組中的某個元素進行排序。 – 2014-10-06 23:26:51

+0

好的。兩個問題。1)如果在具有say(1,2,3)的數組上使用sort,$ a需要1,$ b需要2?那麼3什麼時候進入圖片。 2)任何人都可以簡單地解釋我在sort {(split'',$ a)[0] cmp(split'',$ b)[0]} @array)執行時概念上發生了什麼。 – Curious 2014-10-07 00:36:04

回答

0

以下修改理解得更好。它與

my @sortedName=sort { (split ' ', $a)[0] cmp (split ' ', $b)[0] } @array 

但更具可讀性。這是修改

my @sortedName=sort{ @arr_a=split(' ',$a); 
     @arr_b=split(' ',$b); 
     @arr_a[0] cmp @arr_b[0]; 
     }(@array); 

這裏@array被讀取,列表中的兩個參數或元素保存在$ a和$ b中。然後使用空格分割並存儲在@ arr_a,@ arr_b中。然後我們只比較第0個元素和排序。

相關問題