2012-04-14 6 views
2

Я работаю на некоторых ДНК (A, T, C и G с шансом U придачей)

У меня сейчас действительно длинная строка полных ДНК неопределенных длина. У меня есть код для нуклеотидных оснований.

%nucleotide_bases = (A => Adenine, 
         T => Thymine, 
         G => Guanine, 
        C => Cytosine); 

$nucleotide_bases{'U'} = 'This is a RNA base called Uracil';#T=U for RNA 

Теперь все, что мне нужно сделать, это положить какой-то цикл, чтобы читать каждый отдельный символ из строки. Поскольку этот код предназначен для студентов, он должен быть простым. Я начал использовать perl сам несколько недель назад, Java до этого.

Строка ($ string1 it's called) должна печатать ее полное имя, когда каждая отдельная базовая пара считывается (по одному). Поэтому, когда строка говорит ATATCGCG

Вывод на экран должен прочитать: аденина Тимина аденина Тимина цитозина гуанина цитозина гуанина

Если это слишком сложно сделать из строки , Я могу использовать массив как отправную точку. Большое спасибо за вашу помощь.

Отличные ответы. Сейчас все будет готово.

Другой вопрос, который у меня был, состоял в том, чтобы убедиться, что пользователь может ввести только базы ДНК (A, T, C & G). Я думаю, что это называется проверкой ввода.

print "Please enter your first DNA sequence now: \n"; 
$userinput1=<>; 
chomp $userinput1; 

Как вы можете добавить туда проверку валидации? Первый запрос печати всегда должен быть повторно запрошен, если не выполнены условия.

Я знаю, что нужно что-то вроде

if($userinput1 ne 'a' or 't' or 'c' or 'g') { 
print "Please enter DNA only (A, T, C or G)"; 
} 

Я не совсем уверен, как вернуться к первоначальному заявлению печати

ответ

3

Используя рецепт Processing a String One Character at a Time, я пришел с этим:

 
use warnings; 
use strict; 

my %nucleotide_bases = (A => 'Adenine', 
      T => 'Thymine', 
      G => 'Guanine', 
      C => 'Cytosine'); 

my $string = 'ATATCGCG'; 
my @array = split(//, $string); 
foreach (@array) { 
    my $char = $_; 
    print $nucleotide_bases{$char}, ' '; 
} 

Обратите внимание, что я использую use warnings и use strict (что, как новичок, возможно, вы тоже должны делать), поэтому мне пришлось добавлять цитаты вокруг базовые имена. Кроме того, программа выдает дополнительное пространство в конце.

+1

Вы можете использовать 'для моего $ char (split //, $ string)', чтобы сэкономить на некотором типе, и IMO сделает ваш код более четким. – TLP

3

Я предполагаю, что вы пытаетесь декодировать различные буквы A, T, G и C из строки и распечатать их полное имя.

print "$nucleotide_bases{$_} " for split //, $string; 

Или использовать массив:

my @array = map $nucleotide_bases{$_}, split(//, $string); 
print "@array"; # quoted to insert spaces between elements. 

В качестве альтернативы split, вы можете использовать регулярное выражение, которое исключит любые не соответствующие символы из декодируется:

my @array = $string =~ /[ATCG]/g; 

О, и когда вы присваиваете значения своему хэшу, вам нужно указать значения. Хороший улов Luke Girvin.

my %nucleotide_bases = (A => "Adenine", ...); 
0

Сценарий:

#!/usr/bin/perl 

use strict; 
use warnings; 

my %nucleotide_bases = (A => 'Adenine', 
         T => 'Thymine', 
         G => 'Guanine', 
         C => 'Cytosine', 
         U => 'Uracil'); 

my $string1 = 'ATATCGCG'; 

$string1 =~ s/([ATGCU])/{$nucleotide_bases{$1}.' '}/ge; 

print $string1, "\n"; 

Выход:

Adenine Thymine Adenine Thymine Cytosine Guanine Cytosine Guanine 
+0

Отличные ответы. Сейчас все будет готово. Другой вопрос, который у меня был, состоял в том, чтобы убедиться, что пользователь может ввести только базы ДНК (A, T, C & G). Я думаю, что это называется проверкой ввода. [CODE] print "Пожалуйста, введите свою первую последовательность ДНК: \ n"; $ userinput1 = <>; chomp $ userinput1; [/ CODE] Как вы можете добавить туда проверку валидации? Первый запрос печати всегда должен быть повторно запрошен, если не выполнены условия. Я знаю, мне нужно что-то вроде [CODE [ if ($ userinput1 ne 'a' или 't' или 'c' или 'g') – Shtanto

0

Пожалуйста всегдаuse strict и use warnings в начале всех ваших программ Perl, особенно тех, с которыми вы ищете помощь. Таким образом, Perl исправит множество простых ошибок, которые вы не заметили, и вы быстро произведете рабочий код.

Это можно сделать очень просто, разделив строку на символы, используя хэш, чтобы перевести их, а затем снова соединить их.

Эта программа демонстрирует идею. Обратите внимание, что я оставил код, который конструирует хеш, как вы его поставили, просто потому, что вы можете предпочесть его таким образом.

use strict; 
use warnings; 

my %nucleotide_bases = (
    A => 'Adenine', 
    T => 'Thymine', 
    G => 'Guanine', 
    C => 'Cytosine', 
); 
$nucleotide_bases{'U'} = 'This is a RNA base called Uracil'; #T=U for RNA 

my $chain = 'ATATCGCG'; 

my $expand = join ' ', map $nucleotide_bases{$_}, split //, $chain; 

print $expand, "\n"; 

выход

Adenine Thymine Adenine Thymine Cytosine Guanine Cytosine Guanine 

Редактировать

В соответствии с просьбой, это прочитать последовательность из консоли и повторите, пока последовательность недействительный. Вывод идентичен выходному коду предыдущего кода.

use strict; 
use warnings; 

my %nucleotide_bases = (
    A => 'Adenine', 
    T => 'Thymine', 
    G => 'Guanine', 
    C => 'Cytosine', 
); 
$nucleotide_bases{'U'} = 'This is a RNA base called Uracil'; #T=U for RNA 

my $userinput1; 
while() { 
    print "Please enter your first DNA sequence now: "; 
    chomp ($userinput1 = uc <>); 
    last unless $userinput1 =~ /[^ATGC]/; 
    printf qq("$userinput1" is an invalid sequence\n); 
} 

my $expand = join ' ', map $nucleotide_bases{$_}, split //, $userinput1; 

print $expand, "\n"; 
+0

Отлично! Вы все же можете спасти мир - Спасибо :) – Shtanto

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