【问题标题】:Perl string concatenation overlaying stringsPerl 字符串连接覆盖字符串
【发布时间】:2012-04-08 14:10:57
【问题描述】:

我试图在 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

当我使用 .操作员。 任何帮助将不胜感激

【问题讨论】:

    标签: string perl concatenation


    【解决方案1】:

    看起来您正在使用回车符 (\r) 从文件中读取 $tree,而 $tree 在其末尾以 \r 结尾,导致它寻找到行首.

    看这个测试:

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

    哪些输出

    abcdefgh012l
    

    【讨论】:

    • 是的,这就是问题所在。我正在使用在 Windows 中创建的模板文件生成树文件。我为他们修复了行尾,现在可以使用了,谢谢
    【解决方案2】:

    正如 patrick 所说,您很可能在 Linux 机器上阅读过 DOS 格式的文件。在这种情况下,如果您在以"\r\n" 结尾的字符串上使用chomp,您将留下"\r"

    像这样清理记录的最简单方法是将chomp替换为

    s/\s+$//
    

    因为"\r""\n" 都算作空格,所以会同时从字符串中删除两者。如果尾随制表符和空格对您很重要,请使用

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

    相反,或者也许

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

    s/\p{Control}+$//
    

    【讨论】:

    • 如果文件已知有“\r\n”行结尾,那么干净的方法是设置$/ = "\r\n",然后使用chomp。
    • @Patrick:我的目的是提供适用于所有文件的东西,无论来源如何,但你是绝对正确的,这就是我要写的。
    【解决方案3】:

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

    • 此问题是否与您的控制台配置方式有关?
    • 其他机器上也会发生这种情况吗?
    • 您能否详细介绍一下您的具体环境?
    • 如果您尝试将该行打印到文本文件而不是标准输出会发生什么?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-01-04
      • 2015-09-25
      • 2018-02-26
      • 2019-02-02
      • 1970-01-01
      • 2015-09-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多