Perlでこのコードの1行コード(またはコマンドラインのより少ない行コード)を書き直す方法は?
質問
私はそのようなコードを持っています: ジェネラコディセタグプレ
このコードは、他の質問の回答に関連しています: DNA to RNAPerlでタンパク質を取得する
プログラムの出力は次のとおりです。 ジェネラコディセタグプレ
Perlでそのコードを書き直すにはどうすればよいですか?コマンドラインで実行され、より少ないコード(可能であれば1行のコード)で書き直されますか?
PS 1: dna.txtは次のようなものです: ジェネラコディセタグプレ
PS 2:コードの行数が少なくなる場合は、my %proteins
変数をファイルに書き込むことができます。
解決
誰か(@kamaci)が別のスレッドで私の名前を呼んだ。これは、コマンドラインでタンパク質テーブルを維持しながら私が思いつくことができる最高のものです: ジェネラコディセタグプレ
(シェル引用、Windowsの場合はジェネラコディセタグコードとジェネラコディセタグコードの文字を交換します)。このバージョンは、無効なコドンを'
でマークします。おそらく、適切な場所に"
を追加することで修正できます。
ヒント:これは、RNAトリプルの生のASCIIエンコーディングから6ビットを選択し、0から101058048までの64コードを提供します。文字列インデックスを取得するには、63を法として結果を減らしますが、これにより1つの二重マッピングが作成され、残念ながら2つの異なるタンパク質をコーディングする必要がありました。 %
は、それらの1つを、適切なタンパク質をコードする別のタグコードにマップします。
また、=~y/%//d
演算子の前の括弧にも注意してください。これは、s/GGG/GGC/i
演算子を%
の引数リストから分離し、、,
とsubstr
の優先順位を修正します。 これを本番コードで使用したことがあるなら、あなたは悪い人です。
他のヒント
私が行うことをお勧めする唯一の変更は、while
ループを単純化することです:
ジェネラコディセタグプレ
y
とtr
は同義語であるため、どちらか一方のみを使用する必要があります。tr
はy
よりも読みやすいと思うので、tr
を選びました。さらに、あなたはそれらを非常に異なって呼んでいましたが、これは同じ効果であり、実際に変更した文字についてのみ言及しているはずです。(他のすべてのキャラクターは自分自身に置き換えられていました。そのため、実際に何が変更されているかを確認するのがはるかに困難になります。)
open(INPUT,"<dna.txt");
とそれに対応するclose(INPUT);
の行を削除すると、シェルパイプラインやさまざまな入力ファイルでプログラムを使用するのが非常に難しくなります。しかし、それはあなた次第です。入力ファイルが常に一般的なタグコードであり、何も変わらない場合、これは問題ありません。
ふぅ。私が思いつくことができる最善のこと、少なくともこれはすぐに。入力が常に大文字であることが確実な場合は、uc
を削除して、さらに2文字を節約することもできます。または、入力が常に同じである場合は、どこからでも読み取るのではなく、すぐに$_
に割り当てることができます。
このコードを本番環境や純粋な楽しみ以外の場所で使用してはならないと言う必要はないと思います。実際のプログラミングを行う場合、ほとんどの場合、読みやすさがコンパクトさよりも優先されます。
コメントで言及した他のいくつかのバージョン:
ファイルから%pとDNAを読み取る: ジェネラコディセタグプレ
perl -e
を使用したシェルから:
ジェネラコディセタグプレ
特に読みやすさが重要であるということは、すでにほとんどのことが指摘されています。私は、以下の内容以上にプログラムを削減しようとはしません。 ジェネラコディセタグプレ
私が追加した唯一の「ワンライナー」は、whileループのpush map grep m//g
です。Perl 5.10には、「定義済みまたは」演算子(//
)が追加されていることに注意してください。これにより、次のように記述できます。
ジェネラコディセタグプレ
わかりました。open do local $/
ファイルのslurpイディオムは、小さなファイルをメモリに丸呑みするのに便利です。少し刺激を受けていただければ幸いです。:-)
タンパク質データを別のファイルに書き込む場合は、スペースを区切り、改行なしで指定します。したがって、ファイルを1回読み取ることでデータをインポートできます。 ジェネラコディセタグプレ
一致演算子には大文字と小文字を区別するオプションがあるため、コード行 " tr / a、c、g、t / A、C、G、T / "を削除できます。大文字と小文字を区別しない( i オプション)。また、元の foreach ループは、上記のコードのように最適化できます。ここでの $ 1 変数は、一致操作 /(\ w {3})/ gi の括弧内の一致パターン結果です。