日本語的にソートする

例えば、「Apple」「Orange」「みかん」「イチゴ」をこの順番で並べたい時、普通にソートしたのでは、「Orange」「みかん」「イチゴ」「Apple」となる。これを、もっと日本語的にソートする。

ついでに処理速度を鑑みて、シュワルツ・ソートしてみました。

#use encoding でやっています。そうでなければ、Jcode->tr を使うといいでしょうね。

use encoding 'utf8';

my @arr = ( 'Apple', 'Orange', 'みかん', 'イチゴ' );
print join( "\n", jsort( @arr ) );

sub jsort {
  return
    map { $_->[0] }
    sort { $a->[1] cmp $b->[1] || $a->[0] cmp $b->[0] }
    map {
      my $org = $_;
      tr/A-Za-za-z0-9ぁ-ん/A-ZA-ZA-Z0-9ァ-ン/;
      [ $org, $_ ];
    }
    @_;
}