perl输出搞砸了fedora,ubuntu

时间:2017-02-05 20:11:24

标签: linux perl terminal fedora-25

我编写了一个用于映射两个数据集的perl脚本。当我使用Linux终端运行程序时,输出搞砸了。看起来输出是重叠的。我正在使用Fedora 25.我在Windows上尝试过代码并且工作正常。

同样的问题也存在于Ubuntu上。

DESIRED:

ADAM 123 JOHN 321

TOM 473 BENTLY 564

依旧......

我得到的输出:

ADAM 123N 321

TOM 473TLY 564

依旧......

我在Windows上测试了代码,它运行得很好。虽然Ubuntu 16.04上还存在同样的问题。

请帮忙。

use warnings;

open F, "friendship_network_wo_weights1.txt", or die;
open G, "username_gender_1.txt", or die;

while (<G>){
    chomp $_;
    my @a = split /\t/, $_;
    $list{$a[0]} = $a[1];
}
close G;

while (<F>){
    chomp $_;
    my @b = split /\t/, $_;
    if ((exists $list{$b[0]}) && (exists $list{$b[1]})){
        $get =  "$b[0]\t${list{$b[0]}}\t$b[1]\t${list{$b[1]}}\n";
        $get =~ s/\r//g;
        print "$get";
    }
}

close F;

1 个答案:

答案 0 :(得分:1)

问题出在Windows上,换行符为\r\n。其他一切都是\n。假设这些文件是在Windows上创建的,当您在Unix上阅读它们时,每一行在\r之后仍会有一个尾随chomp

\r是“回车”字符。就像在一台旧打字机上,你必须将整个打印头移回到一行末尾的左侧,计算机显示曾经是fancy typewriters called Teleprinters。打印时,光标会移回到行的开头。在被覆盖后打印的任何内容。这是一个简单的例子。

print "foo\rbar\r\n";

您将看到bar。这是因为它打印......

  1. foo
  2. \r将光标发送回行的开头
  3. bar会覆盖foo
  4. \r将光标发送回行的开头
  5. \n转到下一行的开头(与光标所在的位置无关)
  6. chomp只会删除字符串末尾$/内的任何内容。在Unix上\n。在Windows上它是\r\n

    有很多方法可以解决这个问题。最安全的方法之一是使用正则表达式手动删除这两种类型的换行符。

    # \015 is octal character 015 which is carriage return.
    # \012 is octal character 012 which is newline
    $line =~ s{\015?\012$}{};
    

    这就是要删除行尾的\r\n