1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

perlワンライナーでAAAAからTTTTまでの塩基配列を全部リストアップする

Last updated at Posted at 2020-11-05

課題

AAAA, AAAC, AAAG, AAAT, AACA, AACC, ..., TTTTと、4塩基からなるDNA塩基配列を全て列挙する。
これを1行1配列の形式でテキストファイルにセーブする。

検討

文字列をいじるんだから、そりゃ使うツールはperlだろう。

単純に考えれば4重forループを作ってその中で文字列を連結して出力すればよい。

だが、幾らなんでも安直というか。第一、4ぐらいならいいがこれを10とか20とかに拡張する必要が生じたとしたらどうする?

解決

標準ではないモジュールに頼っているのが癪ではあるが、思いつく限りではこれが一番簡単だった。

perl -MMath::BaseCalc -le '$n=4; $x=new Math::BaseCalc(digits=>[qw/A C G T/]); map {print substr('A' x $n.$x->to_base($_), -$n)} 0..4**$n-1' > output.txt

塩基配列を4進数の数字と捉えて処理している。先頭の$nの定義を変更してやれば、塩基数が10でも200でも1000でも問題なく処理できるはずだ、多分。

おわりに

もっとクールな方法をご存じの方はコメントで教えてください。

追記

私が書いたものより遥かにクールなコードを書いた方がさっそく現れた。

組み合わせを生成する - Perl - ルモーリン

それによれば、以下でいける。

perl -E "say for <@{['{A,C,G,T}' x 4]}>"

ふつうはファイル名の展開に使うglobをこう云うふうに使うアイディア、@{[]}記法の応用など、いずれも私の引き出しにはないものだった。

perlを使いはじめて何年もたつが、本当に奥が深い。いまだ深淵を見通すこと叶わず。

1
1
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?