Perl 输出在 Fedora、Ubuntu 中搞砸了



我写了一个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.这是因为它打印...

  1. foo
  2. r将光标发送回行首
  3. bar会覆盖foo
  4. r将光标发送回行首
  5. 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

相关内容

  • 没有找到相关文章

最新更新