2011-12-05 37 views
1

我有這段代碼;使用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------ 

如果我刪除 「*」 的字符串是正確的(他們是真的我想要打印的字符串),問題在於它的放置。這是印刷:

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

爲什麼打印的字符串的開始,而不是結束德,因爲它是咋辦?

非常感謝。

+0

我懷疑這不是你的實際代碼,因爲如果沒有後面跟着換行符,就不可能打印'*'。 –

+0

這是,我用複製和粘貼,只是插入一些空格,以獲得代碼正確顯示。 – hfingler

+0

你確定你沒有流浪的回車(Ctrl + M)嗎?一個'print'^ M *「'(其中'^ M'是一個文字CR)會產生你所看到的輸出,但你的編輯器可能沒有正確顯示它。 –

回答

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機器,其中的行以\r\n結尾。在OSX上的perl中讀取該文件時,您正在使用chomp刪除換行符。在OSX中,chomp只會刪除\n(默認情況下)並保持\r不變。

+0

這很有趣。當我發佈我的時候,我沒有看到這個答案,但它說它是在28分鐘前發佈的? – TLP

+0

@TLP - 抱歉,我暫時刪除了它,因爲我實際上沒有回答這個問題,因此我花了幾分鐘時間來添加代碼和輸出。我想它保持原來的發佈時間 –

+0

好吧,我真的很生氣。目前沒有任何工作正在進行,即使我的mac屏幕捕捉崩潰了,也不會工作了。我的朋友使用的是一個Ubuntu虛擬機,它工作正常。我無法真正在我的mac tho上找到問題。 – hfingler