package Language::MySort; require Exporter; @ISA = qw( Exporter ); @EXPORT = qw( lang sort ); %words = (); sub lang_sort { my ($ignore, $same, $chars, $tr, $sorter) = ("", ""); if (ref $_[-1]) { my $opt = pop; $ignore = $opt->{ignore} || ""; $same = $opt->{translate} || ""; $ignore = "\$s =~ tr/\Q$ignore\E//d;"; if ($same) { my @f = map substr($_, 0, 1, ""), @$same; $same = " =~ tr/" . quotemeta(join "", @$same) . "/" . quotemeta(join "", map $f[$_] x length($same->[$_]), 0 .. $#$same) . "/"; } } $chars = @_ == 1 ? shift : join "", @_; $tr = eval qq{ sub { (my \$s = shift) $same; $ignore \$s =~ tr/\Q$chars\E/\000-\377/; \$s; } }; $sorter = sub { my @used = map $tr->($_), @_; @{ $words{$chars} }{ @used } = @_; @{ $words{$chars} }{ sort @used }; }; return wantarray() ? ($sorter, $tr) : $sorter; } 1;