作者: dune
日時: 2004/1/02(05:11)
極悪です。

藤岡和夫 さんの [TSfree:586] Re: 欄区切りのソート から
>#mlsort.pl
>$/="";$lnum = shift;
>while(<>){
>  ($mlr{(split(/\n/))[$lnum - 1]} = $_) =~ s/\n*\Z/\n\n/;
>}
>foreach $key (sort keys(%mlr)){
>  print $mlr{$key};
>}

これだと同じキーがあったときにデータが上書きされてしまうので、
厳密には while ブロックの中で if(exists $mlr{...}){...} とか
やる必要があります。でもこの手の問題は深く考えずに Scwartz 
変換にもっていくのが定石でしょう。

ソートに使うフィールドが1個だけなら、

--^mlsort2.pl
use strict;
$/ = "";
my $lnum = $ARGV[0] || 0;
print grep{ s/\A.+\n// }
    sort
    map{ s/\n*\Z// and (split m/\n/)[$lnum]."\n$_\n\n" } <STDIN>;
--$

複数あるなら

--^mlsort3.pl
use strict;
$/ = "";
my $lnum = $ARGV[0] || 0;
print map{ $_->[0]."\n\n" }
  sort{ $a->[1] cmp $b->[1] or $a->[2] cmp $b->[2] or ... } # ※
  map{ s/\n*\Z// and [$_,(split m/\n/)[@ARGV]] } <STDIN>;
--$
※)もっとマトモな解を募集

フィールドが複数あって優先順位があって昇順・降順、辞書順・数
値順、という話になったらやっぱり use Sort::Fields; かな。
-- 
FZH01112 at nifty.com
http://hpcgi1.nifty.com/dune/gwiki.pl?