2014-01-20 2 views
0

У меня есть файл подобного:Perl - странствовать через файл

>Sequence1 
AAAAASSSSSSSSDDD 
BBHSHSJSKJSKJSSS 
SJKÑLSDJFSLSLJKS 
>Sequence2 
AAASSSSSSSSSSDDW 

до 55 последовательностей.

мне нужно сохранить каждую последовательность (например AAAAASSSSSSSSDDD в другую переменную Таким образом, я должен создать столько переменных, сколько последовательностей имеет свой файл

До сих пор у меня есть:..

#!/usr/bin/perl 

while (<>) { 
    if (/^>/) { 
     $count++; 
     next; 
    } 
} 

print $count;  #It prints 55. 

Как следует Я по-прежнему? Я потерял создавать динамически переменные ...

+1

Возможно, есть хороший модуль для файлов fasta, которые вы можете использовать при поиске CPAN. Это довольно распространенный вопрос здесь о SO. – TLP

ответ

3

Я хотел бы использовать хэш так:

my %sequences; 
my $key; 
while (<>) { 
    chomp; 
    if (/^>(\w+)/) { 
     $key = $1; 
     next; 
    } 
    $sequences{$key} = $_; 
} 

Последнее предложение может быть:

$sequences{$key} .= $_; 

Вы также можете использовать хэш-массива:

my %sequences; 
my $key; 
while (<>) { 
    chomp; 
    if (/^>(\w+)/) { 
     $key = $1; 
     next; 
    } 
    push @{$sequences{$key}}, $_; 
} 
+0

Что значит '(\ w +)'? – user2886545

+1

@ user2886545 '\ w' - это класс символов, который включает' [a-zA-Z0-9_] ', скобки фиксируют строку до' $ 1'. – TLP

+0

Что делать, если моя последовательность разделяется линиями разрыва? – user2886545

3

инструмент вам нужно для работы, называется массив См. perldata для документации.

my $count = -1; 
my @sequences; 

while (<>) { 
    if (/^>/) { 
     $count++; 
    } else { 
     $sequences[$count] .= $_; 
    } 
} 

Вы используете Bio::Perl?

+0

Что Bio :: Perl выглядит очень красиво. Я всегда колебался, чтобы связать людей, которые демонстрируют довольно ограниченное понимание Perl для BioPerl.org, поскольку это выглядит пугающе. – DeVadder

+0

Я мог бы использовать его ... – user2886545

1

использования такой массив:

#!/usr/bin/perl 

my @sequences; 
while (<>) { 
    if (/^>/) { 
     $count++; 
     next; 
    } 
    else 
    { 
     chomp $_; 
     push @sequences, $_; 
    } 
} 

print $count;  #It prints 55. 

Теперь у вас есть массив со всеми вашими последовательностями, упорядоченными и всеми.

+0

Что делать, если моя последовательность разбита линиями разрыва? – user2886545

+0

Как я написал, это означало бы, что последовательность будет разделена на две части, но, по крайней мере, '' count' будет по-прежнему правильной. ^^ Если это проблема, обязательно используйте версию Chorobas как '. =' Означает присоединение к строке. Обратите внимание, что в их версии все символы новой строки сохранены. Если вам не нужна новая строка после каждой последовательности и в середине каждого, что было разделено заранее, вставьте 'chomp $ _;' в свой ответ сразу после 'else'. Или просто перейдите по ссылке на Bio :: Perl и используйте это. – DeVadder

Смежные вопросы