2014-10-11 1 views
0

Это часть моего входного Genbank файла:

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 

И я хочу, чтобы извлечь название журнала, например, J. Gen. Virol. (не включая номер выпуска и страницы)

Это мой код, и он не дает никаких результатов, поэтому мне интересно, что происходит не так. Я использовал круглые скобки для $ 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

ответ

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"; 
} 

Я думаю, было бы проще просто получить данные из API Pubmed! ;)

+0

Я использовал круглые скобки для $ 1, $ 2 и т. Д. Но мой учитель сказал мне попробовать, не используя этот метод, вместо этого используйте substr. – zebra

+0

@zebra вы также должны скопировать и вставить соответствующие строки из вашего файла Genbank и вашего скрипта в вопрос. –

+0

Я скопировал строки в моем файле genbank, но он отличается от того, что я вижу в моей программе текстового редактора – zebra

4

Другой способ сделать это, чтобы воспользоваться BioPerl, который можно разобрать в GenBank файлы:

#!/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 сохраняется в файле с именем AC_000005.1.gb, вы получить:

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. 
Смежные вопросы