我已经阅读了很多指南,也许我只是没有得到它。
我有一个字符串并将其转换为数组。现在我需要根据最后一列按降序排列其内容。以下是我的数组在“字符串视图”中的样子:
@array = [
Machine1, 01/02/2016, 02/01/2016, 26
Machine2, 02/01/2016, 02/01/2016, 1
Machine3, 02/01/2016, 02/01/2016, 78
]
在这个数组中,整个“Machine1,01 / 02 / 2016,0 / 01 / 2016,26”被认为是数组中的整个字符串,并且基于最后一列(我考虑过) )这是:26,1,78< - 我希望我可以按降序排序:78,26,1。
抱歉这个幼稚的问题。
提前致谢。
答案 0 :(得分:3)
当array of arrays更好时,从字符串数组开始并不理想,但我们可以通过split
将每个字符串用于其组成部分。然后我们只对你感兴趣的元素进行排序,鲍勃就是你的叔叔。
use strict;
use warnings;
use Data::Dump;
my @array = (
'Machine1, 01/02/2016, 02/01/2016, 26',
'Machine2, 02/01/2016, 02/01/2016, 1',
'Machine3, 02/01/2016, 02/01/2016, 78',
);
@array = sort { $b->[3] <=> $a->[3] }
map { [ split(/,\s*/) ] }
@array;
dd(\@array);
输出:
[
["Machine3", "02/01/2016", "02/01/2016", 78],
["Machine1", "01/02/2016", "02/01/2016", 26],
["Machine2", "02/01/2016", "02/01/2016", 1],
]
如果您需要保留原始格式的数据,可以使用Schwartzian transform:
@array = map { $_->[0] }
sort { $b->[1] <=> $a->[1] }
map { [ $_, (split(/,\s*/))[3] ] }
@array;
结果:
[
"Machine3, 02/01/2016, 02/01/2016, 78",
"Machine1, 01/02/2016, 02/01/2016, 26",
"Machine2, 02/01/2016, 02/01/2016, 1",
]
答案 1 :(得分:0)
反转每个字符串,按需要排序(降序),然后将它们反转。
use warnings;
use strict;
my @array = (
'Machine1, 01/02/2016, 02/01/2016, 26',
'Machine2, 02/01/2016, 02/01/2016, 1',
'Machine3, 02/01/2016, 02/01/2016, 78'
);
my @sorted = map { my $s = reverse; $s }
sort { $b cmp $a }
map { my $s = reverse; $s } @array;
print "$_\n" for @sorted;
打印
Machine3, 02/01/2016, 02/01/2016, 78 Machine1, 01/02/2016, 02/01/2016, 26 Machine2, 02/01/2016, 02/01/2016, 1
答案 2 :(得分:-2)
使用Schwartzian变换(perl中的谷歌Schwarzian变换)
通过创建新数组{index,string},对索引进行排序,但只打印出字符串(不做进一步处理)来完成。