電子書籍の厳選無料作品が豊富!

例えば、
@a=(2,1,0);
print sort(@a);

上記では、(0,1,2)を返します。
然し、そうでは無くて添え字を出したいのですが。上記の場合の出カは
(2,1,0)として出カをしたいのですが。perlのコードが分かりません。

perlのコードをお教え願います。
宜しくお願いします。

A 回答 (1件)

説明用に


・データと添字に同じ値があるので、混同しないように値を変えます。
・そのままでは2種類の$aが出てきてしまうので、リスト変数の名前を変えます。
@l=(5,4,3);
print sort(@l);


http://perldoc.jp/func/sort
sort の後に、関数名やブロックを書くことで、並び換えの順番を制御することができます。

これを使って
「@lの全添字のリストを、その添字に対応した$l[x]の値で比較してソートする」
とすれば、ご希望のものが得られます。

@index=(0,1,2);
@l=(5,4,3);
print sort( { $l[$a] <=> $l[$b] } @index);
#工夫すれば、 @index を使わずに書けます。
# ( http://perldoc.jp/docs/perl/5.20.1/perlop.pod#Ra … )


また、上記URLに、ハッシュのキーをハッシュの値の順番に並べる、という例があります。
> # this sorts the %age hash by value instead of key
> # using an in-line function
> @eldest = sort { $age{$b} <=> $age{$a} } keys %age;

これ応用して、 添字→キー、リストの値→ハッシュの値 と対応させる方法もあります。
%h =( 0=>5,1=>4,2=>3 );
print sort( { $h{$a} <=> $h{$b} } keys %h);


ハッシュのキーと値、ではなく、無名リストで添字と値のペアにする、という方法もあります。
%l =( [0,5],[1,4],[2,3] );
print map {$_->[0]} ( sort( { $a->[1] <=> $b->[1] } @l) );
# sortの結果はリストへのリファレンスになっているので、そこから添字だけ取り出す必要があります。
    • good
    • 0
この回答へのお礼

早速の回答、有難う御座います。

@index=(0,1,2);
@l=(5,4,3);
print sort( { $l[$a] <=> $l[$b] } @index);

上記がシンプルで使いたいと思います。

お礼日時:2016/08/21 12:43

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!