Маленькая проблема при печати пары строк с использованием Perl - PullRequest
1 голос
/ 05 декабря 2011

У меня есть этот фрагмент;

print "$score\n";
for (my $i = 0; $i < $n; $i++)
{
print $output[$i];
if($i == $center)
{
    print "*";
}
print "\n";
}

и это должно напечатать это:

-62
ttagggcccgg-a-tc---attaccgggc--caa
tta--gcgcgg-attcg-gatta-cggg---c-a*
gcg--gggcggcattagcaattt-gggg-atc-a
-ta--gcgc---a-----aataa-ccgg------

но вместо этого он печатает это:

-62
ttagggcccgg-a-tc---attaccgggc--caa
*ta--gcgcgg-attcg-gatta-cggg---c-a
gcg--gggcggcattagcaattt-gggg-atc-a
-ta--gcgc---a-----aataa-ccgg------

Если я уберу «*», строки будут правильными (это действительно строки, которые я хочу напечатать), проблема заключается в их размещении. это напечатано:

-62
ttagggcccgg-a-tc---attaccgggc--caa
tta--gcgcgg-attcg-gatta-cggg---c-a
gcg--gggcggcattagcaattt-gggg-atc-a
-ta--gcgc---a-----aataa-ccgg------

Почему он печатает в начале строки, а не в конце, как это должно быть?

Большое спасибо.

1 Ответ

3 голосов
/ 05 декабря 2011

Ваш код отлично работает в системе * nix, где \n является единственным ограничителем строки, а строки текста в @output не заканчиваются на \n.

#!/usr/bin/perl

my @output = ("ttagggcccgg-a-tc---attaccgggc--caa",
              "tta--gcgcgg-attcg-gatta-cggg---c-a",
              "gcg--gggcggcattagcaattt-gggg-atc-a",
              "-ta--gcgc---a-----aataa-ccgg------");

my $center = 1;
my $score = -62;

print "$score\n";
for (my $i = 0; $i < 4; $i++)
{
    print $output[$i];
    if($i == $center)
    {
        print "*";
    }
    print "\n";
}

Выход:

-62
ttagggcccgg-a-tc---attaccgggc--caa
tta--gcgcgg-attcg-gatta-cggg---c-a*
gcg--gggcggcattagcaattt-gggg-atc-a
-ta--gcgc---a-----aataa-ccgg------

Единственный способ, которым я вижу, как ваш код генерирует вывод, который вы публикуете, - это если каждая строка текста, содержащаяся в @output, заканчивается \r, что приведет к возврату каретки, тогда вы напечатаете * (который перезапишет первый символ строки, которую вы только что вывели), за которой следует \n в нижней части цикла.

Если я изменю @output в моем примере на:

my @output = ("ttagggcccgg-a-tc---attaccgggc--caa\r",
              "tta--gcgcgg-attcg-gatta-cggg---c-a\r",
              "gcg--gggcggcattagcaattt-gggg-atc-a\r",
              "-ta--gcgc---a-----aataa-ccgg------\r");

Тогда вывод будет:

-62
ttagggcccgg-a-tc---attaccgggc--caa
*ta--gcgcgg-attcg-gatta-cggg---c-a
gcg--gggcggcattagcaattt-gggg-atc-a
-ta--gcgc---a-----aataa-ccgg------

ТАК, окончательный ответ таков: избавьтесь от \r в конце тех. :)

Редактировать: Как указывает TLP в комментариях ниже, использование подстановки регулярных выражений, чтобы убедиться, что в конце этих строк нет ничего, должно вас исправить:

for (my $i = 0; $i < 4; $i++)
{
    $output[$i] =~ s/\s*$//;
    print $output[$i];
    ...

Последнее редактирование: Из приведенных ниже комментариев от TLP я бы угадал эти данные считываются из файла, который поступил с машины Windows, где строки заканчиваются на \r\n. При чтении этого файла в perl на OSX вы используете chomp для удаления новых строк. В OSX chomp только удалит \n (по умолчанию) и оставит \r без изменений.

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