2014-11-17 1 views
0

아래 코드는 다음 결과를 얻습니다. 예를 들어 문자열의 점 사이에서 키와 값을 선택하여 해시 만들기

$seq 세트 aaaGACGTCaaaGAATTCaaaGACGTCaaa에 :

RE: AatII 
GACGTC found at 4-9 
GACGTC found at 22-27 
RE: EcoRI 
GACGTC found at 4-9 
GACGTC found at 22-27 
GAATTC found at 13-18 

이 내가 달성하고자하는 것과 아주 가까이있는 동안은, 내가 정말하고 싶은 것은 "참조 효소"의 목록을 사용하는 것입니다 - 어떤 I 해시 키 (예 : AatIIEcoRI : %RE)에 저장 - $seq 시퀀스 문자열에서 가장 잘린 사이트를 찾고 결과를 해시와 같은 데이터 구조에 저장하려면

해독 사이트 선택은 해시의 각 참조 효소 키에 대한 연관된 ​​"효소 문자열"값에 따라 수행됩니다. 아래 코드에서 키 AatIIGACGTC 5으로 설정됩니다. 다섯 번째 위치 이후에 GACGTC을자를 것입니다 : (GACGT|C); EcoRI => GAATTC 1은 첫 번째 위치 (G|AATTC) 뒤에 GAATTC 시퀀스를 분할합니다. 그래서, 내 해시에있는 각 효소 키에 대해 해당 키의 해시 값에 해당 문자열과 관련된 숫자의 키와 연관된 문자열과 "잘라 사이트"를 기반으로 시퀀스 $seq에있는 사이트를 찾습니다. 번호는 효소 문자열의 "1"위치 다음에 절단 위치를 나타냅니다.

시퀀스 $seq의 경우 결과는 (aaaGACGT)(CaaaG)(AATTCaaaGACGT)(Caaa)입니다. 여기에서 대괄호는 절단 점을 표시하는 데 사용됩니다. aaaGACGT CaaaG AATTCaaaGACGT Caaa

:

   0------8 9---13 14----------26 27--30 

이가 떠나 전체 순서를 효소 시퀀스를 선택하고 잘라 모두 EcoRIAatII를 사용하여 스크립트의 실행을 기반으로 다음과 같이 문자열의 절단 부위의 위치는 것

내 스크립트에서 각 실행 결과를 {0=>8, 9=>13, 14=>26, 27=>30}과 같은 키/값이 포함 된 해시에 저장하고 싶습니다. 내 키에 sort을 사용하고 각 반복 후에 을 사용하여; 가장 가까운 이전 컷 사이트를 찾기 위해 이진 검색을 사용하고 현재 반복에서 $end의 값이되도록 "1"을 추가하면 해시에 cutsites가있는 수만큼의 항목이 있어야합니다.

이것이 가능한지 확실하지 않습니다. 그렇다면 누군가가 올바른 방향으로 나를 가리킬 수있는 방법이 문제에 접근하기 위해 누군가가 내 코드를 변환하도록 도울 수 있습니까?

#!/usr/bin/perl 

use warnings; 
use strict; 

my %RE =('AatII' => 'GACGTC 5', 'EcoRI' => 'GAATTC 1'); 
my $input=''; 
my @matches =(); 
my @enz = keys %RE; 
my @value = values %RE; 
print "Seq:"; 
my $seq = <STDIN>; 
chomp $seq; 
print "OK \n"; 
while ($input ne 'quit') { 
    print "RE:"; 
    $input = <STDIN>; 
    chomp $input; 
    foreach (@enz) { 
     if ($input =~ /$_/) { 
      #print "Key:", $_," Value:", $RE{$_}; 
      my @seqval = $seq; 
      my $val = $RE{$_}; 
      my $real = substr($val, 0, -2); 
      #my $cut = substr($val, 0, (length($val)-3)); 
      my $cut = chop $val; 
      my $length = length ($real); 
      my $mew = substr ($real, 0, $cut); 
      my $two = substr ($real, -1, ($length-$cut));    
      #my $push = push @valval; 
      #chomp %RE{$_}; 
      while ($seq =~ /($real)/g) { 
       my $match = $1; 
       #print "$match", "\n"; 
       my $length = length($&); 
       #print "$length", "\n"; 
       my $pos = length($`); 
       #print "$pos", "\n"; 
       my $start = $pos + 1; 
       #print "$start", "\n"; 
       my $end = $pos + $length; 
       #print "$end", "\n"; 
       my $hitpos = "$start-$end"; 
       #print "$hitpos", "\n"; 
       push @matches, "$match found at $hitpos "; 
       #print "\tfound:", "\n","\n"; 
       #print "\t\t\t$1$mew", "\n"; 
       #print "\t\t\t$two$3", "\n"; 
       #print "next restriction enzyme:","\n"; 
      } print "$_\n" foreach @matches; 
     } 
    } 
} 
+0

좋은 출발점 : http://www.bioperl.org/wiki/Main_Page –

+0

해시 키를 정렬 할 수 없습니다. 배열이 필요합니다. – user1937198

+0

결과에서 원하는 것을 완전히 이해하고 있는지 잘 모르겠습니다. 'key'가 '0'이고 'value'가 '8'('{0 => 8, ...} ') 인 해시를 원하십니까? 기타.)? –

답변

0

안녕 Khuram 그리고 그것은 당신이 당신의 질문에 떨어졌다 수 있습니다하지만 난 그게 더 완전하고 그것을 발견 다른 사람에게 잠재적으로 유용하게이 대답을 추가 해요 보인다

:-) 유래에 오신 것을 환영합니다. @mappec에서 제안한대로 더 많은 리소스를 찾을 수있는 Bioperl 웹 사이트를 참조하십시오.

이 작업을 수행하는 더 간단한 방법이있을 수 있지만 자르기 사이트를 저장하기위한 해시를 만드는 것이 좋은 방법인데, 그 이유는 perl의 기능 중 하나를 활용하기 때문입니다. 임의로 복잡한 데이터 구조를 만들 수있는 능력 파리. 즉, 데이터를 다시 가져 오는 것이 때때로 복잡 할 수 있습니다!:-)

으로 @ user1937198 노트, 해시, 정렬되지 않은 있습니다 당신이 원하는 경우 출력 순서를 보존하기 때문에/만하여 해시를 정렬 할 필요가 없습니다 것 시퀀스에서 효소 문자열의 위치 해당 키를 사용하여 시작할 수있는 정렬 가능한 키를 만들어야합니다. 귀하의 질문에 sort ed 데이터를 가지고 있지 않기 때문에 귀하의 샘플 출력은 found at 4-9, ... 22-27... 13-18의 순서로 표시됩니다. 그 부분을 고치기가 너무 어렵지 않습니다. 이를 증명하기 위해, 여기에 스크립트가 제거 인쇄 문 중 일부와 HoH (해시의 해시)로 처리 된 $seq 시퀀스 문자열의 주문이 를 유지되지, 그 키에 의해 정렬됩니다 %cuttings라고합니다 (그러나 기억) :

#!/usr/bin/perl 
use warnings; 
use strict; 

my %RE =('AatII' => 'GACGTC 5', 'EcoRI' => 'GAATTC 1'); 
my %cuttings =(); 
my $input=''; 
my @enz = keys %RE; 
print "Seq:"; 
my $seq = "aaaGACGTCaaaGAATTCaaaGACGTCaaa"; 
chomp $seq; 
print "OK \n"; 
while ($input ne 'quit') { 
    print "RE:"; 
    $input = <STDIN>; 
    chomp $input; 
    foreach (@enz) { 
     if ($input =~ /$_/) { 
      my @seqval = $seq; 
      my $val = $RE{$_}; 
      my $real = substr($val, 0, -2); 
      my $cut = chop $val; 
      my $cutsite = 0 ; 
      my $length = length ($real); 
      my $mew = substr ($real, 0, $cut); 
      my $two = substr ($real, -1, ($length-$cut));    
      while ($seq =~ /($real)/g) { 
       my $match = $1; 
       my $length = length($&); 
       my $pos = length($`); #`fix SO syntax highlighting :) 
       my $start = $pos + 1; 
       my $end = $pos + $length; 
       my $hitpos = "$start..$end"; 
       my $cutsite = $end ; 
       ${$cuttings{ $cutsite }}{ $input } = "$match at $hitpos "; 
      } 
      } 
     } 

    foreach my $cutsite (sort { $a <=> $b} keys %cuttings) { 
     print " $cuttings{$cutsite}{$_}\n" for (keys %{ $cuttings{$cutsite} }); 
    } 
} 

는 출력은 다음과 같습니다

$ ~/tmp/ perl biogenetic.pl 
Seq:OK 
RE:EcoRI 
GAATTC found at 13..18 
RE:AatII 
GACGTC found at 4..9 
GAATTC found at 13..18 
GACGTC found at 22..27 
RE:quit 

AatII 효소 절단 사이트가 제대로 분류되어 "주위에"처음 EcoRI 재 ference 효소. 당신은 당신이 프로그램은 END 블록에 종료 할 때 Data::Dumper 또는 (또한 DDP라고도 함) Data::Printer 해시를 덤프하는 데 사용할 수있는 함께 가서 같은 외모를 가지고 무엇을보고 싶다면 :

END { 
    use DDP; 
    p %cuttings ;        
} 

을 보여줄 것입니다 그 다음

{ 
    9 { 
     AatII "GACGTC found at 4..9 " 
    }, 
    18 { 
     EcoRI "GAATTC found at 13..18 " 
    }, 
    27 { 
     AatII "GACGTC found at 22..27 " 
    } 
} 

NB : 난 그냥 그것이 정도로 당신이 거기 대부분의 방법이었다이 작업을 수행하는 코드를 재사용했습니다. 나는 유전 학자가 아니므로 효소 줄이 겹쳐지는 것처럼 보이면 여전히 문제가있을 수 있습니다. 당신의 코드에서 추적 할 많은 변수 이름이 있습니다. 아마도 좀 더 단순하거나 더 우아해질 수있는 방법을 리팩토링하는 방법이 있습니다. 저는 여러분과 다른 공헌자들을위한 운동으로 남겨두고 있습니다 :-) 자주 perl을 사용한다면 그것을 아주 빨리 잘한다.

HTH. 프로젝트에 행운을 빈다.