カレッヂ |
質問者 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裏技 |