如何在Perl中按单行对2D数组排序?

时间:2019-04-03 11:13:52

标签: perl

我有2D数组:

my @array = ([3,4,1,2], [Black,Orange,White,Blue]);

我需要按第一行对其进行排序,因此预期结果是

1,2,3,4
White, Blue, Black, Orange

在perl中有什么快速的方法吗? 我知道如何分别对每一行进行排序,但这不是目标。

2 个答案:

答案 0 :(得分:1)

我不确定Perl中2D数组的含义。
根据您问题的表示法,有2个单独的数组引用:

$array_ref1 = [3, 4, 1, 2];
$array_ref2 = ['Black', 'Orange', 'White', 'Blue'];

2D数组可能是其中之一:

@array_of_arrayrefs = ([3, 'Black'], [4, 'Orange'], [1, 'White'], [2, 'Blue']);
%hash = (3 => 'Black', 4 => 'Orange', 1 => 'White', 2 => 'Blue');

在大多数情况下,我建议尽可能使用散列-您可以在此处阅读一些有关散列的信息:Hashes in Perl

您可以将sort function用于数组

# for array_of_arrayrefs
my @sorted_array = sort { $a[0] <=> $b[0] } @array_of_arrayrefs;

由于哈希是键值对的无序组,因此只需调用keys function并对结果数组进行排序(根据需要使用它来调用哈希值)。

答案 1 :(得分:0)

如果您具有关联的键和值,那么我首先要说的是要将数组转置为哈希:

#!/usr/bin/env perl

use strict;
use warnings; 

use Data::Dumper;

my @array = ([3,4,1,2], ["Black","Orange","White","Blue"]);

my %mapping;
#Assign 'first array' as keys, and second array as values. 
@mapping{@{$array[0]}} = @{$array[1]};


#for debugging
print Dumper \%mapping; 

my @sorted_keys = sort keys %mapping;

print join (",", @sorted_keys),"\n"; 
print join (",", @mapping{@sorted_keys} ),"\n";

在散列切片分配方面,我的工作很简单,但是它允许您执行任意排序并保持键值关系。

您也可以将其调整为适用于多行输入,以保留列关系,尽管它确实变得有点复杂,您不能再像我一样使用哈希切片分配,但是您可以构建每一行分成键值对,然后按需打印或合并它们以仅对列值进行一次哈希处理。