gpt4 book ai didi

linux - Fedora、ubuntu 中的 Perl 输出困惑

转载 作者:太空宇宙 更新时间:2023-11-04 05:42:57 24 4
gpt4 key购买 nike

我编写了一个 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 上,换行符是 \r\n。其他一切都是 \n。假设这些文件是在 Windows 上创建的,当您在 Unix 上读取它们时,每行在 chomp 之后仍然会有一个尾随 \r

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

print "foo\rbar\r\n";

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

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

关于linux - Fedora、ubuntu 中的 Perl 输出困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42056751/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com