【问题标题】:Can someone help me with the column sorting code in perl有人可以帮我处理 perl 中的列排序代码吗
【发布时间】: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 运算符返回 10-1,具体取决于左侧运算符是大于、等于还是小于右侧运算符。例如。 "a" cmp "b" 返回-1。然后,内部归并排序例程会使用该比较进行排序。

标签: perl sorting


【解决方案1】:

下面的修改更好理解。和

一样
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 个元素并排序。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-04-28
    • 2015-12-06
    • 1970-01-01
    • 2021-01-04
    • 2020-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多