前編では1.
後編である今回は,
鬼車による正規表現の強化
1.
名前を使った参照
マッチした部分文字列を,
コード1 正規表現のマッチ部分を名前で参照する
# (?<foo>...) にマッチした部分を $~[:foo] で参照できる
if "Taro Yamada" =~ /^(?<first_name>\w+) (?<last_name>\w+)$/
p $~[:first_name] #=> "Taro"
p $~[:last_name] #=> "Yamada"
end
これによって,
また,
コード2 正規表現のマッチ部分がローカル変数に代入される
if /(?<first_name>\w+)\s+(?<last_name>\w+)/ =~ "Taro Yamada"
p first_name #=> "Taro"
p last_name #=> "Yamada"
end
表現能力の向上
\g<n>によって,
コード3 正規表現でかぎ括弧の対応を判定する
# かぎ括弧の対応がとれた文字列にマッチする正規表現
re = /^(\[\g<1>+\]|x)$/
p "[[x][x]]"[re] #=> "[[x][x]]"
p "[[x][x]"[re] #=> nil
p "[[x][x]]]"[re] #=> nil
また,
順序付きHash
1.
コード4 ハッシュの順序が保存される
h = { "dog" => 1, "cat" => 2 }
h["panda"] = 3
h.each {|k| p k }
図1 コード4の実行結果
# 1.8の場合:順序は不定 $ ruby18 hash-order.rb ["cat", 2] ["panda", 3] ["dog", 1] # 1.9の場合:挿入した順序 $ ruby19 hash-order.rb ["dog", 1] ["cat", 2] ["panda", 3]
これによって,
プロセスの起動
system関数が拡張され,
コード5 柔軟なプロセス起動
# 環境変数ENV_VAR=childを指定して起動する
system({ "ENV_VAR" => "child" }, "echo $ENV_VAR")
# 標準出力をファイルにリダイレクトして起動する
open("log", "w") do |f|
system("echo child", out: f) # ファイルlogに"child"が書き込まれる
end
# 子プロセスを起動するだけ(子プロセスの終了を待たない)
spawn("echo child") #=> pid
環境変数や標準入出力やエラー出力以外にも,
また,
有理数と複素数が組み込みに
従来rational.
コード6 有理数と複素数
# 1/3+1/6=1/2
p Rational(1,3) + Rational(1,6) #=> (1/2)
# 虚数i*i=-1
p Complex(0,1) * Complex(0,1) #=> (-1+0i)
著者は数学クイズの解答ツールに使ったことがあります。