2012-03-24 74 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