CGI-BBS > CGI > Perl > ソート方法についての質問


カレッヂ
カレッヂ


質問者 yaku sima  投稿日 7/18(水) 03:10:55
sub my_sort{
        my ($filenames,$sort_flag)=@_;
        my $fbind=sub{my $a=quotemeta $_[1];my $buf=[split /$a/,$_[0]];splice @$buf,-1;};
        {
                $sort_flag==1 and $filenames=[map{$_->[0]}sort{$a->[1] <=> $b->[1]}map{[$_,-M]}@$filenames],last;
                $sort_flag==2 and $filenames=[map{$_->[0]}sort{$a->[1] cmp $b->[1]}map{my $a=$fbind->($_,'/');my $b=$fbind->($_,'.');[$_,$b]}@$filenames],last;
        }
        map{print "$_\n"}@$filenames;
}

 この関数の6行目のものでの質問なんですが、この行では、ファイル(いろいろなパス名つき)の最後の拡張子の文字列順にソートしたもののリファレンスを$filenamesに受け取らせたいんです。
 うまくは動くんですけど、もっと簡単にできませんか。最後の拡張子をたどるのにわざわざ関数を使ってるとか。正規表現で書けるとか。ご指導お願いします。
回答者 呑兵衛  [削除]  投稿日 7/18(水) 19:00:14
呑兵衛といいます。

Schwartzian Transform はややこしい! ですね。
rindex を役に立ててください。
$_ のエンドから数えて最初に "." が現れれば "." に続く文字列をエンドに向かって取り出します。
拡張子 = substr($_, rindex($_, ".")+1);
ということで、

$sort_flag == 2 and
$filenames = [map{$_->[0]}
sort {$a->[1] cmp $b->[1]}
map{substr($_, rindex($_, ".")+1)}@$filenames],last;

であってるでしょうか? ひょっとして [拡張子] とすべきかも。
ついでにこの方法だと、最初の sub は quotemeta のところ以外要らないかしら。
質問者 yaku sima  [削除]  投稿日 7/19(木) 00:01:38
reverse index関数(rindex)ですか。それは思いつきませんでした。ラクダにちゃんと書いてあるのに(-_-;。多謝。

>ひょっとして [拡張子] とすべきかも。

そうです。呑兵衛さんのコード少しミスってましたよ。[拡張子]は、最初のネストするところですよね。これは、[$_,拡張子]です。

$filenames=[map{$_->[0]}sort{$a->[1] cmp $b->[1]}map{[$_,substr($_,rindex($_,'.')+1)]}@$filenames],last;

>ついでにこの方法だと、最初の sub は quotemeta のところ以外要らないかしら。

$fbind 自体いらないですよね。


後から気が付いたのですが、微妙に以前のコード間違ってたんですよ。気づきました?

my $b=$fbind->($_,'.'); は、my $b=$fbind->($a,'.'); でした。次のようにすると分かりやすいかも。

$sort_flag==2 and $filenames=[map{$_->[0]}sort{$a->[1] cmp $b->[1]}map{[$_,$fc->($fc->($_,'/'),'.')]}@$filenames],last;
回答者 呑兵衛  [削除]  投稿日 7/19(木) 18:55:30
> 呑兵衛さんのコード少しミスってましたよ。

はい、ミスってました。拡張子を迷子にしてましたね。
すんません。後段に付いては

> うまくは動くんですけど

とおっしゃっていたのと、プロセスを変えるので
貴殿のスクリプトの中身はあまり見てなかった、
というか Schwartzian Transform はあまり好きでないため
map はやめて〜〜!という思いが強かったので・・・。

この部分だけ見てると、root が usr ディレクトリのファイル管理をする
もののように思えますね。頑張ってください。では。

返信(回答)する


Web裏技