Perl屋のためのRubyメモ


何をやるにもPerlで考えてしまうようになった人のためのRuby表現集。 順不同。

while (<>) {...}

標準入力を読み込んで繰り返すループ。IOクラスのメソッドで 組み込みメソッドとして使える gets を利用する。

while gets
  ...
end

これだと $_ に結果が入る。

ファイルのオープンクローズ
open("file", "r") {|file|
  while line=file.gets
    ...
  end
}

て感じかな。上記のようにブロックを渡せば、何があっても自動的に closeしてくれる。ファイルがひらけなければデフォルトでプログラムが 終了する。無い場合の処理を書きたいときは begin〜rescue〜end を使う。

変数

変数の名前によって変わるのは値のタイプ(スカラ・ベクタとか)では なく、変数のスコープ。

小文字で始まる変数 ローカル変数
大文字で始まる変数 定数
$で始まる変数 グローバル変数
@で始まる変数 インスタンス変数
制御構造
引数解析

個人的にgetoptsは融通効かないので自前で解析している。お約束のルー プはこんな感じになる。

while /^-([a-z]+)$/no =~ $*[0]
  sw = $1
  case sw
  when /x/
    なんちゃら
  end
  $*.shift
end
Array

newしておけば勝手に大きくなる。意味不明だなこりゃ。以下の例を見 よ。

× x[3] = 3
○ x = [0, 1, 2]; x[3] = 3
○ x=Array.new; x[3] = 3
○ (x=Array.new)[3] = 3
       
scan

文字列中の(複数の)特定のパターンを切り出して変数にいれたいとき はscan。perlでいうと ($dir, $name) = m,(.*)/(.*),; みたいなやつ。 scanは、複数のパターンが何回も繰り返して現れることを想定しているの で、配列の配列が返ることに注意。

たとえば、yuuji@gentei.org を。正規表現 /(.*)@(.*)/ と照合す るとそれぞれのグループには yuuji と gentei.org が当てはまる。がこ れ、正規表現全体が何回もマッチすることを想定しているので、たとえ一 回だけマッチしたとしても、マッチしたペアの配列が更に配列で返る。

"yuuji@gentei.org".scan(/(.*)@(.*)/) → [["yuuji", "gentei.org"]]

てことで、一回だけマッチすることを想定している場合に、二つの変 数に取り込むには配列の先頭を取り出して、

      user, domain = "yuuji@gentei.org".scan(/(.*)@(.*)/)[0]
      

とする。


yuuji@example.org
Fingerprint16 = FF F9 FF CC E0 FE 5C F7 19 97 28 24 EC 5D 39 BA
HIROSE Yuuji - ASTROLOGY / BIKE / EPO / GUEST BOOK / YaTeX [Tweet]