1

我有一个看起来像这样的数组:

array[0]: 6 8
array[1]: 12 9 6
array[2]: 33 32 5
array[3]: 8 6

我想对这个数组进行排序,使其看起来像这样:

array[0]: 6 8
array[1]: 6 9 12
array[2]: 5 32 33
array[3]: 6 8

我知道我可以使用 对数组进行排序@newarray = sort {$a cmp $b} @array;,但我还需要对每一行中的元素进行排序。我怎样才能做到这一点?

4

3 回答 3

8

2021-03-16 更新:亲爱的未来访客,我已经接受了答案,而且我仍在获得支持,但@FMc 的解决方案显然比我的要好。(FMc 和 dalton 有相同的答案,但据我所知,FMc 是第一个到达那里的。)

无论如何,如果您遇到这种情况,请使用 Perl 的内置映射,而不是我对自定义子例程的原始答案。

原始答案:假设你有一个字符串数组,并且你想要的只是对每个字符串进行排序,就好像它是一个数字子数组(但留下一个字符串?):

#!/usr/bin/env perl
use strict;
use warnings;

my @array = ('6 8', '12 9 6', '33 32 5', '8 6');

foreach my $string (@array) {
    $string = split_sort($string);
}

sub split_sort {
    my $string = shift @_;
    my @internal_nums = split ' ', $string;
    @internal_nums = sort {$a <=> $b} @internal_nums;
    return join ' ', @internal_nums;
}

print "@array\n";
于 2010-07-19T10:25:00.007 回答
7

您也可以使用地图解决它:

#!/usr/bin/env perl

my @numbers = (
    '6 8',
    '12 9 6',
    '33 32 5',
    '8 6',
);

my @sorted;
push (@sorted, map { join " ", sort { $a <=> $b }  (split / /, $_) } @numbers);


print "$_\n" for @sorted;

输出:

6 8
6 9 12
5 32 33
6 8
于 2010-07-19T11:18:40.030 回答
5

您有一个要转换的项目列表这是map的完美候选人。还要注意split的默认行为:它$_在删除前导空格后对空格进行拆分。

my @array = ('6 8', '12 9 6', '33 32 5', '8 6');
@array = map { join ' ', sort {$a <=> $b} split } @array;
于 2010-07-19T10:07:31.180 回答