Perl字符串连接覆盖字符串

时间:2012-03-24 03:51:18

标签: string perl concatenation

我试图在perl中连接3个字符串,并且我得到了奇怪的行为。数据刚刚写入脚本中的文件,我正在尝试向数据中添加两列。

这是我的代码及其行为

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 个答案:

答案 0 :(得分:4)

看起来您正在使用回车符($tree)从文件中读取\r,而$tree最后会以\r结尾,导致它寻求线的开头。

参见此测试:

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

哪个输出

abcdefgh012l

答案 1 :(得分:1)

正如帕特里克所说,很有可能你在Linux机器上读过DOS格式的文件。在这种情况下,如果您对以chomp结尾的字符串使用"\r\n",则会留下"\r"

清理此类记录的最简单方法是将chomp替换为

s/\s+$//

,由于"\r""\n"都计为空格,因此将同时从字符串中删除两者。如果尾随制表符和空格对您很重要,请使用

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

相反,或者

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

s/\p{Control}+$//

答案 2 :(得分:0)

在Windows和Linux下尝试后,我无法复制您的问题。

  • 问题可能与您的控制台的配置方式有关吗?
  • 它也会在其他机器上发生吗?
  • 您能详细说明您的确切环境吗?
  • 如果您尝试将该行打印到文本文件而不是stdout会发生什么?