• ベストアンサー

ソ-トについて

「Perlめも」のソ-トの解説で判らないところがあります、 # 第 2項でソートする @data = map {$_->[0]} sort {$a->[2] <=> $b->[2]} map {[$_, split /,/]} @data; ソート後のデータ @data = ('A,2,黄緑', 'C,3,青紫', 'B,4,赤', 'C,6,青', 'A,7,緑', 'A,9,紫', 'B,10,黄'); ###################### @data = map {$_->[0]} は、元の要素に戻すとありますが、 解説をお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • leaz024
  • ベストアンサー率75% (398/526)
回答No.1

そもそも、「map」と「無名配列」というものは理解できていますか? できていないのであれば、まずはその辺を勉強してみてください。 以下、理解できているものとして解説します。 # 一応、「Perlメモ」のページを知らない方のために、URLを載せておきます。 # 初期データは、参考URLをご覧下さい。 まず、最初に実行されるのは、   map {[$_, split /,/]} @data です。これが実行されると、次のようなリストが生成されます。   ['A,7,緑', 'A', '7', '緑'],   ['C,6,青', 'C', '6', '青'],   ['B,4,赤', 'B', '4', '赤'],   ['A,9,紫', 'A', '9', '紫'],   ['A,2,黄緑', 'A', '2', '黄緑'],   ['B,10,黄', 'B', '10', '黄'],   ['C,3,青紫' 'C', '3', '青紫'] ※リストの各要素は、無名配列へのリファレンスです。 ※無名配列の内容は、(元のデータ, 分解したデータ1,分解したデータ2・・・) です。 次に、   sort {$a->[2] <=> $b->[2]} (さっきのリスト) が実行されます。 この時、$a や $b には、リストの要素である無名配列へのリファレンスが入ります。 元データ内での第2項というのは、ここでは ->[2] に入っているので、この値で比較を行っています。 この実行結果は、次のようなリストになります。   ['A,2,黄緑', 'A', '2', '黄緑'],   ['C,3,青紫' 'C', '3', '青紫'],   ['B,4,赤', 'B', '4', '赤'],   ['C,6,青', 'C', '6', '青'],   ['A,7,緑', 'A', '7', '緑'],   ['A,9,紫', 'A', '9', '紫'],   ['B,10,黄', 'B', '10', '黄'] ※この時点でも、リストの要素は無名配列へのリファレンスのままです。 そして最後に実行されるのが、問題の   map {$_->[0]} (さっきのリスト) です。 map は foreach と同様に、$_ がリストの各要素の別名になるので、$_->[0] というのは、   ['A,2,黄緑', 'A', '2', '黄緑']->[0] つまり   ('A,2,黄緑', 'A', '2', '黄緑')[0] よって   'A,2,黄緑' のことになります。 ここでの map は、これのリストを生成するので、最終的に「ソート後のデータ」が @data に代入されるわけです。 最初の map の時点で、元のデータが無名配列の最初の要素として入れてあったので、ここでそのデータを取り出す、ということです。

参考URL:
http://www.din.or.jp/~ohzaki/perl.htm
hana3090
質問者

お礼

本にも書いていないことまで説明していただき有難うございます、 今のところ完全に理解できませんが勉強して理解できるように努力 いたします。

関連するQ&A