根据数组元素中的子字符串对数组进行排序

时间:2019-03-26 21:16:55

标签: perl sorting substring

有没有一种方法可以根据数组元素的子字符串对数组进行排序。例如,假设我有以下数组:

@myArray = qw("AAA|111|bbb" "CCC|333|ddd" "EEE|444|fff" "GGG|222|hhh");

我想基于子字符串对数组进行排序,该子字符串从位置4(从零开始)开始,长度为3(在我的示例中,第一个数组元素为“ 111”)。

对于所有元素,每个数组元素的长度将始终相同,并且要排序的子字符串对于数组元素中相同的长度将始终位于相同的位置。

这是我排序后的输出结果:

AAA|111|bbb

GGG|222|hhh

CCC|333|ddd

EEE|444|fff

此外,虽然我在示例中将数字显示为子字符串,但其中也可能是非数字值。因此,排序也必须适用于非数字。

2 个答案:

答案 0 :(得分:1)

sort可以采用第一个参数,该参数是比较两个元素的代码块:

#!/usr/bin/perl
use warnings;
use strict;
use feature qw{ say };

my @myArray = qw( AAA|111|bbb CCC|333|ddd EEE|444|fff GGG|222|hhh );


say for sort { substr($a, 4, 3) cmp substr($b, 4, 3) } @myArray;

另请参阅substr

请注意,我从qw()中删除了双引号。 “ qw”代表“引号”,因此不需要引号(实际上,它们将成为字符串的一部分,而这并不是您想要的)。

使用Sort::Key模块,它可以变得更加简单:

use Sort::Key qw{ keysort };
...
say for keysort { substr $_, 4, 3 } @myArray;

答案 1 :(得分:0)

如果这是固定长度字段的记录,管道的用途是什么?

如果您将输入视为管道分隔值,那么您的代码将变为

say for sort { ( split /\|/, $a )[1] <=> ( split /\|/, $b )[1] } @myArray;

use Sort::Key qw( ikeysort );

say for ikeysort { ( split /\|/ )[1] } @myArray;

[这并不是完整的答案,而是choroba的扩展。]