Linux Perl:如何简单地安排数组的内容

时间:2016-03-01 02:49:06

标签: linux perl

我已经阅读了很多指南,也许我只是没有得到它。

我有一个字符串并将其转换为数组。现在我需要根据最后一列按降序排列其内容。以下是我的数组在“字符串视图”中的样子:

   @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。

抱歉这个幼稚的问题。

提前致谢。

3 个答案:

答案 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},对索引进行排序,但只打印出字符串(不做进一步处理)来完成。