1.9で最近出るようになっているエラーの対処方法メモ

ちょっと前からRubyを動かすと出てくるようになったこのエラーだけど、自分の1.8時代に作ったスクリプトが原因かと思っていたら本体のoptparse.rbに問題があったぽいのでメモ。

/opt/ruby1.9.1/lib/ruby/1.9.1/optparse.rb:326: warning: regexp match /.../n against to UTF-8 string


修正方法

def accept(t, pat = /.*/nm, &block)

このRegexpのオプションのnmになっている所のnが原因。mに修正したら良いみたい。
nmで検索したら他にも有るので念のため全部修正した。


ググったらhttp://www.bookshelf.jp/2ch/tech/1223709050.htmlで見つかった。

671デフォルトの名無しさんsage
> ruby -roptparse -ve "OptionParser.new{|opt| opt.parse!(ARGV)}" かめはめは
ruby 1.9.1p0 (2009-01-20 revision 21700) [i386-mingw32]
C:/local/lib/ruby/1.9.1/optparse.rb:1262: warning: regexp match /.../n against to Windows-31J string
C:/local/lib/ruby/1.9.1/optparse.rb:1278: warning: regexp match /.../n against to Windows-31J string

optparse.rb中の正規表現に『n』がついてるために警告が出る
修正求ム

--- optparse.rb.0
+++ optparse.rb
@@ -530,3 +530,3 @@
#
- def accept(t, pat = /.*/nm, &block)
+ def accept(t, pat = /.*/m, &block)
if pat
@@ -1261,3 +1261,3 @@
# long option
- when /\A--([^=]*)(?:=(.*))?/nm
+ when /\A--([^=]*)(?:=(.*))?/m
opt, rest = $1, $2
@@ -1277,3 +1277,3 @@
# short option
- when /\A-(.)((=).*|.+)?/nm
+ when /\A-(.)((=).*|.+)?/m
opt, has_arg, eq, val, rest = $1, $3, $3, $2, $2
@@ -1504,3 +1504,3 @@
#
- accept(String, /.+/nm) {|s,*|s}
+ accept(String, /.+/m) {|s,*|s}


nってなんだったけ?と思って調べると$KOCDE関係らしい。
http://doc.okkez.net/192/view/spec/literal#regexp

Ruby は日本語化されているので、$KCODE の値に従って正規表現中の日本語文字を正しく扱います。$KCODE = "n" の場合、日本語文字を一切認識せずにバイト列として扱います。これはデフォルトの動作です。

オプションとして n, e, s, u のいずれかを指定することで正規表現文字コードを $KCODE の値に関係なく個々の正規表現リテラルに指定することもできます。

多分、文字コードにUTF8を指定しているからwarningがでているんだと思う。