わたなべです. matz / caelum.co.jp (Yukihiro Matsumoto) writes: :あえていえばquoteのsafeのあたりとかで正規表現を使ったり, :sprintfの代わりにpackを使ったりするのがruby風なんでしょうか. それじゃ perl 風だと思う :-) pack じゃなくて unpack を使ってみようと思ったら p "A".unpack("H2")[0] "41\000" のように余計な "\0" が入ってます. p じゃなくて print だと気づかないっすね. def quote(s, *extra) pattern = '([^-,.\w' + extra.join + '])' s.gsub(pattern) { "%" + $1.unpack('H2')[0].upcase } end うっ, [^\w] が出てきてしまった :-) こっちも大丈夫ですよね? -- わたなべひろふみ
--- pack.c.orig Fri Mar 14 04:25:51 1997 +++ pack.c Thu Mar 27 13:34:20 1997 @@ -568,14 +568,13 @@ if (p[-1] == '*' || len > (send - s) * 8) len = (send - s) * 8; bits = 0; - ary_push(ary, bitstr = str_new(0, len + 1)); + ary_push(ary, bitstr = str_new(0, len)); t = RSTRING(bitstr)->ptr; for (i=0; i<len; i++) { if (i & 7) bits >>= 1; else bits = *s++; *t++ = (bits & 1) ? '1' : '0'; } - *t = '\0'; } break; @@ -588,14 +587,13 @@ if (p[-1] == '*' || len > (send - s) * 8) len = (send - s) * 8; bits = 0; - ary_push(ary, bitstr = str_new(0, len + 1)); + ary_push(ary, bitstr = str_new(0, len)); t = RSTRING(bitstr)->ptr; for (i=0; i<len; i++) { if (i & 7) bits <<= 1; else bits = *s++; *t++ = (bits & 128) ? '1' : '0'; } - *t = '\0'; } break; @@ -608,7 +606,7 @@ if (p[-1] == '*' || len > (send - s) * 2) len = (send - s) * 2; bits = 0; - ary_push(ary, bitstr = str_new(0, len + 1)); + ary_push(ary, bitstr = str_new(0, len)); t = RSTRING(bitstr)->ptr; for (i=0; i<len; i++) { if (i & 1) @@ -617,7 +615,6 @@ bits = *s++; *t++ = hexdigits[bits & 15]; } - *t = '\0'; } break; @@ -630,7 +627,7 @@ if (p[-1] == '*' || len > (send - s) * 2) len = (send - s) * 2; bits = 0; - ary_push(ary, bitstr = str_new(0, len + 1)); + ary_push(ary, bitstr = str_new(0, len)); t = RSTRING(bitstr)->ptr; for (i=0; i<len; i++) { if (i & 1) @@ -639,7 +636,6 @@ bits = *s++; *t++ = hexdigits[(bits >> 4) & 15]; } - *t = '\0'; } break;