`The rubyist'【えぬ】の日記

2013-07-14

Ruby 2.0の正規表現 \K のバグ?(11/2追記) Ruby 2.0の正規表現 \K のバグ?(11/2追記) - `The rubyist'【えぬ】の日記 を含むブックマーク はてなブックマーク - Ruby 2.0の正規表現 \K のバグ?(11/2追記) - `The rubyist'【えぬ】の日記

Ruby 2.0からOnigmoが採用され、新たなメタキャラクタ「\K」が使えるようになった。

http://doc.ruby-lang.org/ja/2.0.0/doc/spec=2fregexp.html の「先読み、後読み(lookahead, lookbehind)」を参照。

しかしこの\K、Regexp#gsub と使うと何か挙動がおかしい。

% irb-ruby-2.0.0-p247
2.0.0p247 :001 > a="foobarbazquux/foobarbazquux"
 => "foobarbazquux/foobarbazquux"
2.0.0p247 :002 > a.sub(/foo\Kbar/, "")
 => "foobazquux/foobarbazquux"
2.0.0p247 :003 > a.gsub(/foo\Kbar/, "")
 => "bazquux/bazquux"

\Kの採用元であるPerlの方は期待通りの挙動を示している。

% perl --version|head -2

This is perl 5, version 16, subversion 3 (v5.16.3) built for i686-linux
% tinyrepl
re.pl$ my $a = "foobarbazquux/foobarbazquux";
"foobarbazquux/foobarbazquux"
re.pl$ $a =~ s/foo\Kbar//r;
"foobazquux/foobarbazquux"
re.pl$ $a =~ s/foo\Kbar//gr;
"foobazquux/foobazquux"

11/2追記

2.1.0-preview1で直ったようです。

http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-dev/47694

https://bugs.ruby-lang.org/issues/8856

% irb-ruby-2.1.0-preview1
irb(main):001:0> a="foobarbazquux/foobarbazquux"
=> "foobarbazquux/foobarbazquux"
irb(main):002:0> a.sub(/foo\Kbar/, "")
=> "foobazquux/foobarbazquux"
irb(main):003:0> a.gsub(/foo\Kbar/, "")
=> "foobazquux/foobazquux"

パッチ見る限り、Onigmoは関係なかったようで。

https://github.com/ruby/ruby/commit/b31965cb43e8f6117435acf6f676cb9a4417afff

Onigmoの方を疑ってしまい申し訳ありませんでした。

2012-12-25

URI#decode_www_formとURI#encode_www_formの非対称性がほのかに気になる件 URI#decode_www_formとURI#encode_www_formの非対称性がほのかに気になる件 - `The rubyist'【えぬ】の日記 を含むブックマーク はてなブックマーク - URI#decode_www_formとURI#encode_www_formの非対称性がほのかに気になる件 - `The rubyist'【えぬ】の日記

1.9.3-p327 :001 > require 'uri'
 => true
1.9.3-p327 :002 > URI.encode_www_form([["a", "A"], ["b", "c"], ["a", "AAA"]])
 => "a=A&b=c&a=AAA"
1.9.3-p327 :004 > URI.decode_www_form("1=2&3=z&1=z&2=222")
 => [["1", "2"], ["3", "z"], ["1", "z"], ["2", "222"]]
1.9.3-p327 :005 > URI.decode_www_form("a=&b=")
 => [["a", ""], ["b", ""]]

問題はここから。

1.9.3-p327 :006 > URI.encode_www_form([["a", ""], ["b"]])
 => "a=&b"
1.9.3-p327 :007 > URI.decode_www_form("a=&b")
ArgumentError: invalid data of application/x-www-form-urlencoded (a=&b)
(略)

2012-03-09

三項演算子(a ? b : c)の結果はPerlだと左辺値だが… 三項演算子(a ? b : c)の結果はPerlだと左辺値だが… - `The rubyist'【えぬ】の日記 を含むブックマーク はてなブックマーク - 三項演算子(a ? b : c)の結果はPerlだと左辺値だが… - `The rubyist'【えぬ】の日記

もちろん(えっ)Rubyでは左辺値ではありません。

(Perl 5.14.2)
% perl -e '$a=1;$b=2;$c=3;($c ? $a : $b) = 1010; print "$a,$b,$c\n"'
1010,2,3

% perl -e '$a=1;$b=2;$c=0;($c ? $a : $b) = 1010; print "$a,$b,$c\n"'
1,1010,0
(Ruby 1.9.3)
% ruby -e 'a=1;b=2;c=0;(c ? a : b) = 1010; p [a,b,c]'
ruby 1.9.3p0 (2011-10-30 revision 33570) [i486-linux]
-e:1: syntax error, unexpected '=', expecting $end
a=1;b=2;c=0;(c ? a : b) = 1010; p [a,b,c]
                         ^

今からでも遅くないので2.0に入れませんか?w

yyamasakyyamasak2012/03/10 00:05(c ? a : b)が返すのはFixnumオブジェクトなので、2=1010って意味わかんないんですけど、というのがRuby的な考えだと思います。

2011-06-03

Ruby 1.9の違うエンコード形式同士のStringを結合させてみるとエラーになる Ruby 1.9の違うエンコード形式同士のStringを結合させてみるとエラーになる - `The rubyist'【えぬ】の日記 を含むブックマーク はてなブックマーク - Ruby 1.9の違うエンコード形式同士のStringを結合させてみるとエラーになる - `The rubyist'【えぬ】の日記

まあ考えてみたら当たり前のことなんだけど。

PerlのEncodeに慣れてからRuby 1.9に来ると、Perlの内部エンコードおよびdecode()に該当するのがなくてちょっと混乱するよね、と。

でも、Stringは自分達のエンコード形式を知っているんだから、結合のときによきにはからってくれてもいいじゃんとか思ってしまうw

UTF-8に揃えろってことですね、わかります。

(enctest)
#!/usr/bin/ruby1.9.1
# coding: utf-8
require './enctest-euc.rb'
UTF = "UTF"

begin
  puts UTF + EUC
rescue => e
  puts e
end
puts UTF + EUC.encode("utf-8")

(enctest-euc.rb)
# -*- coding: euc-jp -*-
EUC = "EUC"

(実行結果)
% ./enctest
incompatible character encodings: UTF-8 and EUC-JP
UTFEUC

2009-09-05

debian(lenny)にrubygems-updateを使ってrubygems 1.3.5を入れたら debian(lenny)にrubygems-updateを使ってrubygems 1.3.5を入れたら - `The rubyist'【えぬ】の日記 を含むブックマーク はてなブックマーク - debian(lenny)にrubygems-updateを使ってrubygems 1.3.5を入れたら - `The rubyist'【えぬ】の日記

/var/lib/gemsじゃなく/usr/lib/ruby/gemsを参照するようになったので

# ln -s /var/lib/gems /usr/lib/ruby/gems

とすることで回避したんだが、これで大丈夫なんだろうか?

検索してみた