• Rubyの勉強を兼ねて、ルーチン的に使うもろもろのスクリプトを書き進めている。たとえばfasta fileを読み込んである配列モチーフを網羅的に検索するとか、シークエンス名によってシークエンスのサブセットを取得するとか、部分シークエンスを取得するとか、ランダムにN個のシークエンスを取り出すとか、あるいは表を読み込み特定のカラムだけを抜き出して新しい表を作るとか、条件にある行だけ抜き出して表を作るとか、まあそんな感じの簡単なメソッドを書いてはテストしている。だんだんとオブジェクト指向なるものが飲み込めつつあるところ。
  • しかし週末に自宅でプログラミングしていて行き詰まってしまったのが、正規表現のグローバルマッチだった。たとえばあるDNA配列のなかからある正規表現にマッチする配列をすべて検索して、その配列と位置を調べたいとする。Perlならオプションのgを使えば簡単に書ける。
# 塩基配列中のTA(G/C)モチーフをすべて見つける
use strict;
my $dna= "atgTAGcgtaTACgcatgcttaatgTAGtcagt";
while ( $dna =~ /ta[gc]/gi ) {
    print $&, "\t", pos($dna), "\n";
}

# =>
# TAG	6
# TAC	13
# TAG	28
  • けれどRubyの参考書等を読んでいても、またネットで検索してみても、Perlのgオプションと同等の機能が見つからない。String.scan というメソッドはあるが、これだとマッチする文字列は得られても、pos($dna)の値を得る方法が分からない。
  • 結局、自分で代替のメソッドを書いてしまったのだけど、もっと簡単にできる方法がある気がしてならない……。