我编写了一个用于映射两个数据集的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;
答案 0 :(得分:1)
问题出在Windows上,换行符为\r\n
。其他一切都是\n
。假设这些文件是在Windows上创建的,当您在Unix上阅读它们时,每一行在\r
之后仍会有一个尾随chomp
。
\r
是“回车”字符。就像在一台旧打字机上,你必须将整个打印头移回到一行末尾的左侧,计算机显示曾经是fancy typewriters called Teleprinters。打印时,光标会移回到行的开头。在被覆盖后打印的任何内容。这是一个简单的例子。
print "foo\rbar\r\n";
您将看到bar
。这是因为它打印......
foo
\r
将光标发送回行的开头bar
会覆盖foo
\r
将光标发送回行的开头\n
转到下一行的开头(与光标所在的位置无关) 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
。