何をやるにもPerlで考えてしまうようになった人のためのRuby表現集。 順不同。
標準入力を読み込んで繰り返すループ。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
newしておけば勝手に大きくなる。意味不明だなこりゃ。以下の例を見 よ。
× x[3] = 3 ○ x = [0, 1, 2]; x[3] = 3 ○ x=Array.new; x[3] = 3 ○ (x=Array.new)[3] = 3
文字列中の(複数の)特定のパターンを切り出して変数にいれたいとき は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]
とする。