Почему Perl tr/// не делает то, что я хочу?

Я использую Perl для сценария, который принимает входные данные в виде двух коротких цепочек ДНК. В качестве выходных данных я объединяю строки из двух строк, а затем печатаю вторую строку, выстроенную в линию поверх ее копии в конце объединенной строки. Например: если входной строкой является AAAA и TTTTT, выведите:

AAAAATTTTT
     TTTTT

Я знаю, что есть другие способы сделать это, но мне любопытно узнать, почему мое использование tr/// не работает.

Код для программы:

use strict;
use warnings;
print "enter a DNA sequence \n";
$DNA1=<>; #<> shorthand for STDIN
$DNA1=~ s/\r?\n?$//;
print $DNA1 "\n\n";
print "enter second DNA sequence \n";
$DNA2=<>;
$DNA2=~ s/\r?\n?$//;
print $DNA2 "\n\n";
$DNA= join("",($DNA1,$DNA2));
print "Both DNA sequences are \"$DNA\" \n\n";
$DNA3=$DNA1;
$DNA3=~ tr/ATCGatcg//;
print $DNA3 "\n\n";
$DNA4= join("",($DNA3,$DNA2));
print $DNA4 "\n\n";
exit;

4 ответа

Решение

Ваш tr изменяет любой из ACTGatcg и удаляет их. Я думаю ты хочешь

$DNA3 =~ tr/atcgATCG/ /;

Вам нужно поставить пробел во второй половине tr команда.

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

my $spaces = ' ' x length($DNA1);

Это может быть просто синтаксическая ошибка. Пытаться:

$DNA3 =~ tr/ATCGatcg/ /;

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

Удачи!

Редактировать: моя ошибка - неправильно понял, что вы хотели сделать. Ответ скорректирован соответственно:)

Это программа, которую вы хотите?

#! Perl

my $s1 = 'AAAAAAAAA';
my $s2 = 'TCGAGCTA';

Распечатать 
    $s1, $s2, "\n", 
    ' ' x длина ( $s1), $s2, "\n";
Другие вопросы по тегам