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

Perl 根据数组元素中的子字符串对数组进行排序,perl,sorting,substring,Perl,Sorting,Substring,是否有一种方法可以根据数组元素的子字符串对数组进行排序。例如,假设我有以下数组: @myArray = qw("AAA|111|bbb" "CCC|333|ddd" "EEE|444|fff" "GGG|222|hhh"); 我想根据从位置4开始的子字符串(从零开始)对这个数组进行排序,长度为3(在我的示例中的第一个数组元素中,这将是“111”) 对于所有元素,每个数组元素的长度将始终相同,对于数组元素中的相同长度,我要排序的子字符串将始终位于相同的位置 这就是我的排序输出的样子: AAA|1

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

@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
此外,在我的示例中,当我将数字显示为子字符串时,其中也可能是非数字值。因此,排序也必须适用于非数字。

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

#!/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;
另见

注意,我从
qw()
中删除了双引号。“qw”代表“quote words”,所以不需要引号(事实上,它们是字符串的一部分,这不是您想要的)

使用该模块,它可以变得更简单:

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

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

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

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

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

谢谢choroba,我将试用您的代码并回复您。ikegami,我不想让数组元素类似于固定长度的记录,但你是对的,现在是这样,我可以移除管道。我忙于编写代码,不知道发生了什么。谢谢你的提醒。Angelo你会发现
打包“a3”
解包“a3”
很有用
use Sort::Key qw( ikeysort );

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