[#23168] File.fnmatch のリファクタリング — "H.Yamamoto" <ocean@...2.ccsnet.ne.jp>

山本です。

13 messages 2004/03/08

[#23192] File.fnmatch と Dir.glob の非互換部分 — "H.Yamamoto" <ocean@...2.ccsnet.ne.jp>

山本です。

19 messages 2004/03/13
[#23194] Re: File.fnmatch と Dir.glob の非互換部分 — matz@... (Yukihiro Matsumoto) 2004/03/13

まつもと ゆきひろです

[#23195] Re: File.fnmatch とDir.glob の非互換部分 — "H.Yamamoto" <ocean@...2.ccsnet.ne.jp> 2004/03/14

山本です。

[#23196] Re: File.fnmatch とDir.glob の非互換部分 — "H.Yamamoto" <ocean@...2.ccsnet.ne.jp> 2004/03/14

山本です。

[#23260] Re: File.fnmatch とDir.glob の非互換部分 — "H.Yamamoto" <ocean@...2.ccsnet.ne.jp> 2004/03/30

山本です。

[#23261] Re: File.fnmatch とDir.glob の非互換部分 — matz@... (Yukihiro Matsumoto) 2004/03/30

まつもと ゆきひろです

[#23265] Re: File.fnmatch とDir.glob の非互換部分 — "H.Yamamoto" <ocean@...2.ccsnet.ne.jp> 2004/03/30

山本です。

[#23238] Re: [ruby-cvs] ruby, ruby/lib, ruby/lib/rss, ruby/sample/openssl: * lib/logger.rb: trim tail space of each line. no user visible change. — Kouhei Sutou <kou@...>

須藤です.

10 messages 2004/03/27

[ruby-dev:23142] Re: backslash in string

From: Minero Aoki <aamine@...>
Date: 2004-03-05 08:30:14 UTC
List: ruby-dev #23142
青木です。

  In mail "[ruby-dev:23139] backslash in string"
    Jun Adachi <adachi@jun.email.ne.jp> wrote:

> 安達@沖データと申します。

> (1) 無意味なバックスラッシュを入れると数が合わない?
> 
> irb(main):010:0> " \ab\de\ff"
> => " \abde\ff"
> 
> これって、" abdeff"か" \ab\de\ff"かのどちらかになって欲しい気がします。
> もちろんlengthで数えると長さは7です。

これは仕様通りです。\a と \f は正しいバックスラッシュ記法なので
それぞれベルと改ページに変換される。\d は正しくないので「d」
そのものになる。


> (2) gsubが正しく動いていない???

> irb(main):002:0> " \\ab\\de\\ff".gsub(/\\([a-f][a-f])/o, "\\1".to_i(16).chr)
> => " \000\000\000"
> 
> これは、おかしい。

gsub は普通のメソッドですから、引数が gsub に渡るまえに
変形してしまっては意味がありません。"\\1".to_i(16) は 0 です。

ブロックのあり・なしだけだと「似たようなもん」だと思ってしまうん
ですが、実際のところ、ブロック付き gsub とブロックなし gsub は
別のメソッドと思ったほうがいいです。この違いにはまる人があまりに
多すぎる。

個人的には以下のように使い分けます。

  * 固定文字列に置換するときは常にブロックなし sub / gsub
  * 可変の文字列に置換するときは常にブロック付き sub / gsub

例えば gsub(/\s+/, "") みたいなのは常にブロックなし。
「\1」や「\&」が出てきそうになったら迷わずブロックを使う。


> irb(main):003:0> " \\ab\\de\\ff".gsub(/\\([a-f][a-f])/o) { | c |            
> irb(main):004:1*    c.to_i(16).chr
> irb(main):005:1> }
> => " \000\000\000"
> 
> これも、おかしい。

c は $& 相当で、つまり「\ab」や「\de」です。
でもって "\\...".to_i は 0 なので、これで正しい結果です。
$1.to_i(16).chr なら予測通りになると思います。
-------------------------------------------------------------------
青木峰郎

In This Thread