2014-10-11 56 views
0

這是我輸入基因庫文件的一部分:

LOCUS  AC_000005    34125 bp DNA  linear VRL 03-OCT-2005 
DEFINITION Human adenovirus type 12, complete genome. 
ACCESSION AC_000005 BK000405 
VERSION  AC_000005.1 GI:56160436 
KEYWORDS . 
SOURCE  Human adenovirus type 12 
    ORGANISM Human adenovirus type 12 
      Viruses; dsDNA viruses, no RNA stage; Adenoviridae; Mastadenovirus. 
REFERENCE 1 (bases 1 to 34125) 
    AUTHORS Davison,A.J., Benko,M. and Harrach,B. 
    TITLE  Genetic content and evolution of adenoviruses 
    JOURNAL J. Gen. Virol. 84 (Pt 11), 2895-2908 (2003) 
    PUBMED 14573794 

而且我想提取例如普通病毒學雜誌期刊名稱。 (不包括問題編號和頁面)

這是我的代碼,它不給任何結果,所以我想知道出了什麼問題。我確實使用了括號爲1美元,2美元等......雖然它的工作,但我的導師告訴我嘗試不使用該方法,而是使用substr。

foreach my $line (@lines) { 
    if ($line =~ m/JOURNAL/g) { 
     $journal_line = $line; 
     $character = substr($line, $index, 2); 
     if ($character =~ m/\s\d/) { 
      print substr($line, 12, $index - 13); 
      print "\n"; 
     } 
     $index++; 
    } 
} 
+0

你什麼意思通過做 「而不使用內存變量」? – asjo 2014-10-11 12:23:35

回答

1

與其匹配並使用substr,它是非常容易使用單一的正則表達式來捕捉整個JOURNAL行並使用括號來捕獲表示日誌信息的文本:

foreach my $line (@lines) { 
    if ($line =~ /JOURNAL\s+(.+)/) { 
     print "Journal information: $1\n"; 
    } 
} 

常規表達式查找JOURNAL後跟一個或多個空格字符,並且(.+)捕獲該行中其餘的字符。

來獲取文本,而無需使用$1,我認爲你正在試圖做這樣的事情:

if ($line =~ /JOURNAL/) { 
    my $ix = length('JOURNAL'); 
    # variable containing the journal name 
    my $j_name; 
    # while the journal name is not defined... 
    while (! $j_name) { 
     # starting with $ix = the length of the word JOURNAL, get character $ix in the string 
     if (substr($line, $ix, 1) =~ /\s/) { 
      # if it is whitespace, increase $ix by one 
      $ix++; 
     } 
     else { 
      # if it isn't whitespace, we've found the text!!!!! 
      $j_name = substr($line, $ix); 
     } 
    } 

如果你已經知道有多少個字符有在左側欄中,你可以做substr($line, 12)(或其他)來檢索$line一個子開始字符12:

foreach my $line (@lines) { 
    if ($line =~ /JOURNAL/) { 
     print "Journal information: " . substr($line, 12) . "\n"; 
    } 
} 

您可以結合兩種技術來消除從日誌數據的發行數量和日期:

if ($line =~ /JOURNAL/) { 
    my $j_name; 
    my $digit; 
    my $indent = 12; # the width of the left-hand column 
    my $ix = $indent; # we'll use this to track the characters in our loop 
    while (! $digit) { 
     # starting with $ix = the length of the indent, 
     # get character $ix in the string 
     if (substr($line, $ix, 1) =~ /\d/) { 
      # if it is a digit, we've found the number of the journal 
      # we can stop looping now. Whew! 
      $digit = $ix; 
      # set j_name 
      # get a substring of $line starting at $indent going to $digit 
      # (i.e. of length $digit - $indent) 
      $j_name = substr($line, $indent, $digit-$indent); 
     } 
     $ix++; 
    } 
    print "Journal information: $j_name\n"; 
} 

我認爲從Pubmed API獲取數據本來會更容易! ;)

+0

我的確使用括號來支付1美元,2美元等等。但是我的導師告訴我不用這種方法就可以嘗試使用substr。 – zebra 2014-10-11 11:20:28

+0

@zebra您還應該複製並粘貼Genbank文件和腳本中的相關行到問題中。 – 2014-10-11 11:25:37

+0

我複製了我的genbank文件中的行,但它與我在文本編輯器程序中看到的不同 – zebra 2014-10-11 11:36:35

4

另一種方式來做到這一點,是採取的BioPerl優勢,這可以解析基因庫文件:

#!/usr/bin/perl 

use strict; 
use warnings; 

use Bio::SeqIO; 

my $io=Bio::SeqIO->new(-file=>'AC_000005.1.gb', -format=>'genbank'); 
my $seq=$io->next_seq; 

foreach my $annotation ($seq->annotation->get_Annotations('reference')) { 
    print $annotation->location . "\n"; 
} 

如果您運行此腳本保存在名爲AC_000005.1.gb文件AC_000005.1,你得到:

J. Gen. Virol. 84 (PT 11), 2895-2908 (2003) 
J. Virol. 68 (1), 379-389 (1994) 
J. Virol. 67 (2), 682-693 (1993) 
J. Virol. 63 (8), 3535-3540 (1989) 
Nucleic Acids Res. 9 (23), 6571-6589 (1981) 
Submitted (03-MAY-2002) MRC Virology Unit, Church Street, Glasgow G11 5JR, U.K. 
相關問題