Perl chomp似乎可以清理整个字符串或防止打印

Perl chomp似乎可以清理整个字符串或防止打印,perl,Perl,我在学习Perl教程的时候发现了一个非常奇怪的行为,不知道为什么。我目前使用的是Ubuntu 18.04,使用的是随它一起发布的标准Perl,版本为5.26.1,输出缓冲关闭 $|=1; 在我的脚本中输入 <INPUT>; while(my $line = <INPUT>){ # chomp($line); print "before $line after"; } 结果是 废话 废话 废话 废话 废话 废话 废话 废话 [我的提示] 我不知道为什么c

我在学习Perl教程的时候发现了一个非常奇怪的行为,不知道为什么。我目前使用的是Ubuntu 18.04,使用的是随它一起发布的标准Perl,版本为5.26.1,输出缓冲关闭

$|=1;
在我的脚本中输入

<INPUT>;
while(my $line = <INPUT>){
    # chomp($line);
    print "before $line after";
}
结果是

废话
废话
废话
废话
废话
废话
废话
废话
[我的提示]


我不知道为什么chomp会阻止所有的东西被打印出来,而且,看起来是最后一个“之后”。有人知道会发生什么吗?

根据@toolic的建议,我注意到该文件是在Windows中准备的。它在每个字符串的末尾显示字符0d和0a
chomp
可能只是删除了新行字符,而回车符除了最后一个字符串外,还将输出流重置为第一个位置。这就是奇数输出的原因。 他的建议也起了作用。 因为我想使用
split
,所以我选择将记录分隔符设置为
\r\n

谢谢你的帮助

根据@toolic的建议,我注意到该文件是在Windows中准备的。它在每个字符串的末尾显示字符0d和0a
chomp
可能只是删除了新行字符,而回车符除了最后一个字符串外,还将输出流重置为第一个位置。这就是奇数输出的原因。 他的建议也起了作用。 因为我想使用
split
,所以我选择将记录分隔符设置为
\r\n

谢谢你的帮助

您的文件有Windows行结尾(CR+LF),但您使用的是Unix系统(无CR+LF)⇒LF转换层(默认情况下添加),因此您将以CR终止线结束

您应该使用类似于
dos2unix
的工具修复该文件


或者,替换
chomp
s/\s+\z/

您的文件有Windows行结尾(CR+LF),但您使用的是Unix系统(无CR+LF)⇒LF转换层(默认情况下添加),因此您将以CR终止线结束

您应该使用类似于
dos2unix
的工具修复该文件

或者,替换
chomp
s/\s+\z/

<INPUT>;
while(my $line = <INPUT>){

    print "blah";
    print "$/";
    print "blah\n";
}