我写了一个perl脚本来映射两个数据集。当我使用 Linux 终端运行程序时,输出被搞砸了。输出似乎重叠。我正在使用 Fedora 25。我已经在Windows上尝试了代码,它工作正常。
同样的问题在Ubuntu上也存在。
期望:
亚当 123 约翰福音 321
汤姆 473 本利 564
等等....
我得到的输出:
亚当 123N 321
汤姆 473TLY 564
等等...
我已经在Windows上测试了代码,它工作得很好。尽管同样的问题仍然存在于Ubuntu 16.04 lts上。
请帮忙。
法典:
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;
问题是在 Windows 上换行符是rn
.在其他所有方面,它都是n
.假设这些文件是在Windows上创建的,当您在Unix上读取它们时,每行在chomp
之后仍然有一个尾随r
。
r
是"回车"字符。这就像在一台旧打字机上,你必须将整个打字头移回行尾的左侧,计算机显示器曾经是称为Teleprinters的花哨打字机。打印时,光标将移回行首。之后打印的任何内容都会被覆盖。下面是一个简单的示例。
print "foorbarrn";
你会看到的是bar
.这是因为它打印...
foo
r
将光标发送回行首bar
会覆盖foo
r
将光标发送回行首n
转到下一行的开头(光标在哪里无关紧要)
chomp
只会删除字符串末尾$/
中的任何内容。在Unix上,这是n
.在Windows上,它是rn
。
有很多方法可以解决这个问题。最安全的方法之一是使用正则表达式手动删除两种类型的换行符。
# 15 is octal character 015 which is carriage return.
# 12 is octal character 012 which is newline
$line =~ s{ 15? 12$}{};
也就是说,删除可能r
,绝对是行尾的n
。