2012-03-24 73 views
1

我想在perl中連接3個字符串,我越來越奇怪的行爲。數據剛剛寫入到腳本中的一個文件中,我試圖向數據添加兩列。Perl字符串連接覆蓋字符串

這裏是我的代碼,而且其行爲

print "phylipId is $phylipId\n"; 
print "Tree is $tree\n"; 
print "Line is $line\n"; 

my $string = join "\t", $phylipId, $tree, $line; 

print "Concatenated is $string\n"; 

給我這個輸出

phylipId is 4 
Tree is (138,((139,141),140)); 
Line is 000931 17.0 1.0 0.135 no 1044 646918204 
Concaten000931s 17.0 1.08,((10.1351),no0)); 1044 646918204 

當我用這也發生了。運營商。 任何幫助,將不勝感激

回答

3

它看起來像你使用的回車符號(\r)從文件中讀取$tree,並$tree在它的結束與\r結束了導致它尋求到該行的開頭。

看到這個測試:

perl -e 'print("abcdefghijkl\r\t012\n");' 

,輸出

abcdefgh012l 
+0

是啊,這就是問題所在。我使用在Windows中創建的模板文件生成樹文件。我爲他們修復了行結尾,現在它可以工作,謝謝 – avs3323 2012-03-25 16:18:16

0

我不能在Windows和Linux下嘗試後複製您的問題。

  • 問題是否與您的控制檯配置有關?
  • 它也發生在其他機器呢?
  • 你能告訴我更多關於你的確切環境嗎?
  • 如果您嘗試將該行打印到文本文件而不是stdout,會發生什麼情況?
1

帕特里克說,這是更有可能您已經閱讀在Linux機器上一個DOS格式的文件。在這種情況下,如果您在以"\r\n"終止的字符串上使用chomp,那麼您將剩下"\r"

清理這樣的記錄的最簡單的方法是用

s/\s+$// 

更換chomp其中,因爲兩者"\r""\n"算作空格,都將同時從字符串中刪除。如果尾隨製表符和空格是重要的,你再使用

s/[\r\n]+$// 

代替,或者

s/[[:cntrl:]]+$// 

s/\p{Control}+$// 
+0

如果文件已知有「\ r \ n」行結尾,那麼幹淨的方法是設置'$/=「\ r \ n」'然後使用chomp。 – Patrick 2012-03-24 22:56:09

+1

@帕特里克:我的意圖是提供一些適用於所有文件的東西,不管其來源如何,但你是絕對正確的,那就是我會寫的東西。 – Borodin 2012-03-25 04:33:20