極悪です。
藤岡和夫 さんの [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?