我从以制表符分隔的文件中读取Perl数组,格式为:
FirstName1 TAB LastName1
FirstName2 TAB LastName2
FirstName3 TAB LastName3
每行有三个元素 - FirstName,TAB,LastName - 这是必要的,因为并非所有姓氏都是单个strIngs
例如
Betty Van der Bildt
如何对LastName上的数组进行排序,然后对FirstName进行排序,请保留TAB?
答案 0 :(得分:2)
我认为你的意思是这个
my @sorted_names = sort {
my ($aa, $bb) = map [ split /\t/ ], $a, $b;
$aa->[1] cmp $bb->[1] or $aa->[0] cmp $bb->[0];
} @names;
以下是您的评论中直接应用于上述排序的数据。如您所见,输出按姓氏后跟名字
排序use strict;
use warnings 'all';
my @names = (
"Mike\tEddelman\n",
"Saleena\tFAhmad\n",
"Patrick\tGainley\n",
"Tim\tHaitkin\n",
"Sue\tHaitken\n",
"Desmond\tLeacock\n",
);
my @sorted_names = sort {
my ($aa, $bb) = map [ split /\t/ ], $a, $b;
$aa->[1] cmp $bb->[1] or $aa->[0] cmp $bb->[0];
} @names;
print @sorted_names;
Mike Eddelman
Saleena FAhmad
Patrick Gainley
Sue Haitken
Tim Haitkin
Desmond Leacock
要进行与案例无关的排序,您应该对要比较的每个值使用fc
注意
use feature 'fc'
在程序的顶部,这对于这项工作至关重要。这仅适用于Perl 5版本16及更高版本
use strict;
use warnings 'all';
use v5.16;
use feature 'fc';
my @names = (
"Mike\tEddelman\n",
"Saleena\tFAhmad\n",
"Patrick\tGainley\n",
"Tim\tHaitkin\n",
"Sue\tHaitken\n",
"Desmond\tLeacock\n",
"Oliver\taabeginningWilliams\n",
"Christina\tvan Melzen\n",
"Ekatarina\tvan den Rekk\n",
);
my @sorted_names = sort {
my ($aa, $bb) = map [ split /\t/ ], $a, $b;
fc $aa->[1] cmp fc $bb->[1] or fc $aa->[0] cmp fc $bb->[0];
} @names;
print @sorted_names;
Oliver aabeginningWilliams
Mike Eddelman
Saleena FAhmad
Patrick Gainley
Sue Haitken
Tim Haitkin
Desmond Leacock
Ekatarina van den Rekk
Christina van Melzen
答案 1 :(得分:1)
my @sorted_names =
map $_->[1], # Extract original values
sort {
$a->[0][1] cmp $b->[0][1] # Two level sort
|| $a->[0][0] cmp $b->[0][0]
}
map [ [split /\t/], $_ ], # Precompute comparison function, saving original values
@names;
警告 - 我还没有对此进行基准测试。对于一些数据集,重复分割字符串可能比访问深度数组结构更快。一般来说,如果您有昂贵的排序标准和大数据集,这种技术就是胜利者。