9

次のような 2 つの配列があるとします。

('1', '6', '8', '4', '5')
('a', 'c', 'd', 'f', 'w')

最初の配列を並べ替えたいのですが、2 番目の配列の要素の順序は最初の配列と同じように変更する必要があるため、2 つの順序は次のようになります。

('1', '4', '5', '6', '8')
('a', 'f', 'w', 'c', 'd')

Perlでそれを行う方法のアイデアはありますか?

4

3 に答える 3

3

ハッシュを使用できます。最初の配列の値を、2 番目の配列から取得した値へのキーとして使用します。次に、を実行しforeach my $key ( sort keys %the_hash) { do stuff }ます。キー値が一意でない場合は、配列のハッシュを使用して値をハッシュにプッシュすると機能します。

#! perl 
use strict;
use warnings;

my @key_data = ('1', '6', '8', '4', '5', '4', '5');
my @val_data = ('a', 'c', 'd', 'f', 'w', 'z', 'w');

my %the_hash;

for ( my $ii=0; $ii<=$#key_data; $ii++) {
    push @{$the_hash{$key_data[$ii]}}, $val_data[$ii];
}

for my $key ( sort keys %the_hash ) {
    print "key $key\n";
    foreach my $val ( @{$the_hash{$key}} ) {
        print "        $val\n";
    }
}
于 2013-05-06T11:51:34.593 に答える
2

Borodin's answer は、あなたの質問に対する優れた、最も Perlish な回答です。あなたのデータの構造は、ハッシュが役立つ可能性があることを示唆しているので、ハッシュを介してデータを関連付け、そのようにソートする例を次に示します。

use strict;
use warnings;
use List::MoreUtils qw(mesh);

my @aa = qw/ 1 6 8 4 5 /;
my @bb = qw/ a c d f w /;

my %x = mesh @aa, @bb;
print join(" ", sort keys %x), "\n";
print join(" ", @x{sort keys %x}), "\n";
于 2013-05-06T11:51:04.620 に答える