2014-10-06 97 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个元素和排序。

相关问题