From: "H.Yamamoto" Date: 2004-02-14T13:15:01+09:00 Subject: [ruby-dev:22864] Re: File.fnmatch とDir.glob 山本です。 >私には文法エラーと書いてあるようには読めませんでした。 すみません、リンクが間違ってました(汗) http://www.linux.or.jp/JM/html/LDP_man-pages/man7/glob.7.html で、「領域指定は陽に `/' 文字を含むことはできない。これは文法エラーとなる。」とあります。 ////////////////////////////////////////////////////////////////////////////////////////// [ruby-dev:16555]以下のスレッドで、 1. fnmatch でも **/ { } が使えたほうがいい。 2. FNM_PATHNAME は **/ があれば必要ないのではないか。現在の fnmatch のデフォルト動作は、 シェルと異なり扱いにくい という意見を読んで、自分でも 3. { } は glob の前でやっているが、{ } が '/' を含めないようにしてしまえば、 fnmatch に移せるんではないか?現在 { } は別々のパターンとして展開している 同じパスを複数回処理してしまうが、fnmatch に移せば [ ] 同様に早いし、同じパスは 1度だけというようにできる。 という考えがあったので、 a. { } を globの前ではなく、fnmatch で実装する。 b. **/ も fnmatch で使用可能にする。これに伴い、File::FNM_PATHNAMEは廃止する。 c. { } と [ ] は '/' を含むことはできない。(例外を出す) の仕様がよさそうな気がしました。 ////////////////////////////////////////////////////////////////////////////////////////// >うむむ、Dir.glob内部でfnmatch()を呼ぶ時にFNM_PATHNAMEを指定 >するようにすると解決する問題なのかな。 FNM_PATHNAME では解決しないと思います。globでは '/' で分割したパターンに fnmatch を呼んでいるので、 パターンには '/' が残っていません。 glob_make_pattern() で、単に '/' ではなく、マジックを考慮して分割すればよさそうですが・・・ 上の仕様 c があれば、 void check_pattern(const char *s) /* 仕様 c に従い、例外を出す */ とか定義して、Dir.glob と File.fnmatch の前に呼べば「単に'/'」の部分はそのままでよさそうなんですが、 まだよくわかりません。