使用perl打印几个字符串时几乎没有问题

时间:2011-12-05 01:30:11

标签: perl

我有这个片段;

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------

如果我删除&#34; *&#34;,字符串是正确的(它们实际上是我想要打印的字符串),问题在于它的放置。打印出来:

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

为什么它会在字符串的开头打印,而不是在te end上打印?

非常感谢。

1 个答案:

答案 0 :(得分:3)

您的代码在* 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机器的文件中读取的,其中行以{{1 }}。在OSX上以perl读取该文件时,您使用\r\n删除换行符。在OSX中,chomp仅删除chomp(默认情况下)并保持\n完好无损。