慣れてないrubyプログラム

rubyの正規表現の^の挙動について数時間悩みました。詳しい人には既知なんでしょうが、perlと挙動が違うんですねぇ。

rubyの^は文字列の先頭および改行コードの次にマッチする。(確かに行頭だ!!)
perlは文字列の先頭だけ。

ですので、文字列のなかに改行コードがあると動作が異なります。私自信、perlスタイルで動作することを期待して何度もプログラムを書いているので、まさかこんな違いがあるとはヤラレました。

例えば次のプログラムはマッチします。


a = "123¥n456¥n789¥n"
p /^7/.match(a)


では、文字列の先頭で確実にマッチさせたいときはどうするのか?というと¥Aを使えば全て解決です。ちなみに後ろは¥zまたは¥z。大文字と小文字で最後の文字が改行のときの挙動が違います。

でもってperlのマニュアルの該当部分も読んでみました。rubyと同じ挙動にするにはmをつければいいようです。例えば次のプログラムはマッチします。


"123¥n456¥n789¥n" =~ /^7/m && print "match¥n"


perlにはまだまだ知らない機能が隠されているようです。奥深いですねぇ。

コメント一覧

rubyのことで聞きたいことがあります。 ・正の整数(10進表記)を入力して、2進表記を出力するプログラムを作成する問題でどうすればいいか分からないので教えて下さい。ただし、整数から2進表記文字列を作るメソッドを作成して、呼び出すように書く。
papa

アルゴリズムのことでしょうか? でしたら、まず文字列を""で初期化しておきます。 次に与えられた数字を2で割ったアマリを求め、0なら”0”を、1なら”1”を文字列の左から追加し、与えられた数字を2で割ります。(少数以下切り捨て) これを与えられた数字が0になるまで繰り返せば、文字列に2進数が格納されます。
Issei

そのプログラムの書き方が分からないのですが・・・。ぜひ教えて下さい!!
papa

たとえばこんな感じかな? #!/usr/local/bin/ruby class Fixnum def to_bin() ret = "" n = self while(n > 0) ret = (n % 2).to_s + ret n = n / 2 end ret end end p 3.to_bin
Issei

どうもありがとうございます。
papa