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 が最初に到達しました。)

いずれにせよ、このような状況が発生した場合は、カスタム サブルーチンの元の回答ではなく、 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 に答える