【发布时间】:2014-10-07 09:38:10
【问题描述】:
我正在学习 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 函数怎么又像(split ' ', $a)[0] 一样拥有$a !?
【问题讨论】:
-
$a和$b对应于数组中的元素。你可以在这里阅读:perldoc.perl.org/functions/sort.html -
$a和$b确实是特殊变量,但您可以通过各种方式对其进行转换——例如将它们拆分并使用结果数组中的某个元素进行排序。 -
好的。两个问题。1)当对数组使用排序时,比如(1,2,3)$a 取 1,$b 取 2?那么3什么时候出现。 2)任何人都可以简要解释一下执行 sort { (split ' ', $a)[0] cmp (split ' ', $b)[0] } @array 时在概念上发生了什么。
-
排序例程从其参数列表中获取两个元素并进行比较。
cmp运算符返回1、0或-1,具体取决于左侧运算符是大于、等于还是小于右侧运算符。例如。"a" cmp "b"返回-1。然后,内部归并排序例程会使用该比较进行排序。