2017-06-06 5 views
-2

PerlでCGIスクリプトを使用してHTMLページを生成しています。Perlを使用してHTMLマークアップを使ってDNA配列内の一致するパターンをハイライト表示

特定のパターンが含まれているかどうかを確認するには、いくつかのシーケンスをフィルタリングする必要があります。それらが含まれている場合、それらのシーケンスをページあたり50塩基/行で印刷し、シーケンス内のパターンを強調表示する必要があります。私のシーケンスは%hashと呼ばれるハッシュの中にあります。キーは名前、値は実際のシーケンスです。

my %hash2; 
foreach my $key (keys %hash) { 
    if ($hash{$key} =~ s!(aaagg)!<b>$1</b>!) { 
     $hash2{$key} = $hash{$key} 
} 
} 

foreach my $key (keys %hash2) { 
    print "<p> <b> $key </b> </p>"; 
    print "<p>$_</p>\n" for unpack '(A50)*', $hash2{$key}; 
} 

この方法は、私はこの方法を用いたパターン「aaagg」を強調表示した場合、ジョブがしかし、私はライン(for unpack '(A50)*')のアンパックをめちゃくちゃにしています「ん」;配列には、アンパックカウントに含まれる太字タグの余分な文字が含まれているためです。長さの違う行を作るのとは別に、50文字をアンパックするためにタグが2行の間に入ると、大きな問題になります。基本的には開いたままで、それ以降のすべては太字です。

+1

マッチの位置と長さを記録し、アンパックして、適切な場所にタグを挿入します。 ...使用可能なサンプルデータと自己完結型スクリプトを提供する必要があります。 –

+0

申し訳ありませんが、私が報告したコードが十分だと思いました。私はマッチの位置と長さを記録しました。適切な場所にタグを展開して挿入するにはどうすればよいですか? – Diesel

+0

質問を定式化する方法については、[MCVE](https://stackoverflow.com/help/mcve)を参照してください。 [my answer](/ a/44394781/100754)も参照してください。 –

答えて

1

以下のスクリプトは、長さ243(http://www.bioinformatics.org/sms2/random_dna.htmlを使用して生成)と可変長パターンのランダムに生成された単一のDNA配列を使用しています。

これは、シーケンス文字列を変更する代わりに、強調表示する必要がある位置を最初に記録することによって機能します。ハイライトは、シーケンスが50塩基のチャンクに分割された後に挿入されます。

強調表示は、ブックキーピングの作業が最小限に抑えられるように、逆の順序で行われます。

#!/usr/bin/env perl 

use utf8; 
use strict; 
use warnings; 
use YAML::XS; 

my $PRETTY_WIDTH = 50; 

# I am using bold-italic so the highlighting 
# is visible on Stackoverflow, but in real 
# life, this would be something like: 
# my @PRETTY_MARKUP = ('<span class="highlighted-match">', '</span>'); 

my @PRETTY_MARKUP = ('<b><i>', '</i></b>'); 

use constant { BAŞ => 0, SON => 1, ROW => 0, COL => 1 }; 

my $sequence = q{ccggtgagacatccagttagttcactgagccgacttgcatcagtcatgcttttccccgtaatgagggccccatattcaggccgtcgtccggaattgtcttggatccggaatgcagcttttctcaccgcttgatgaacattcactgaatatctgacgccgcgaaaacagggtcactagcctgtttccggtcgcccgagaccggcgagtttgtggtatcgcgagcgcccccgggcggtagggtct}; 

my $wanted = 'c..?gg'; 

my @pos; 

while ($sequence =~ /($wanted)/g) { 
    push @pos, [ pos($sequence) - length($1), pos($sequence) ]; 
} 

print Dump \@pos; 

my @output = unpack "(A$PRETTY_WIDTH)*", $sequence; 

print Dump \@output; 

while (my $pos = pop @pos) { 
    my @rc = map pos_to_rc($_, $PRETTY_WIDTH), @$pos; 
    substr($output[ $rc[$_][ROW] ], $rc[$_][COL], 0, $PRETTY_MARKUP[$_]) for SON, BAŞ; 
} 

print Dump \@output; 

sub pos_to_rc { 
    my $r = int($_[0]/$_[1]); 
    my $c = $_[0] - $r * $_[1]; 
    [ $r, $c ]; 
} 

出力:これは宿題となっていることが判明し、特に以来

C:\...\Temp> perl s.pl 
--- 
- - 0 
    - 4 
- - 76 
    - 80 
- - 87 
    - 91 
- - 97 
    - 102 
- - 104 
    - 108 
- - 165 
    - 170 
- - 184 
    - 188 
- - 198 
    - 202 
- - 226 
    - 231 
--- 
- ccggtgagacatccagttagttcactgagccgacttgcatcagtcatgct 
- tttccccgtaatgagggccccatattcaggccgtcgtccggaattgtctt 
- ggatccggaatgcagcttttctcaccgcttgatgaacattcactgaatat 
- ctgacgccgcgaaaacagggtcactagcctgtttccggtcgcccgagacc 
- ggcgagtttgtggtatcgcgagcgcccccgggcggtagggtct 
--- 
- ccggtgagacatccagttagttcactgagccgacttgcatcagtcatgct 
- tttccccgtaatgagggccccatattcaggccgtcgtccggaattgtctt - ggatccggaatgcagcttttctcaccgcttgatgaacattcactgaatat 
- ctgacgccgcgaaaacagggtcactagcctgtttccggtcgcccgagacc - ggcgagtttgtggtatcgcgagcgcccccgggcggtagggtct

、それはこれを取ると、あなたのハッシュテーブル内のすべての系列に適用するのはあなた次第です。

関連する問題