Doc说:
排骨; #避免在最后一个字段上使用\ n
但是,如果文件具有Windows CRLF,则仅从末尾删除LF。
my $line = <STDIN>;
print chomp $line; # 1
print map{ ord } split '', $line; # 46 49 13
如何从末尾删除两个CRLF
字符?
答案 0 :(得分:4)
Glib答案:在Windows上运行程序。
glib答案少一点:在处理数据之前,先通过dos2unix
运行数据文件。
几乎完全不是glib答案:
您指向的文档以此开头:
此安全版本的印章会删除与
$/
当前值相对应的所有尾随字符串
因此,如果要更改chomp()
的行为,则需要更改$/
的值。
{ # Always localise changes to Perl's internal variables.
local $/ = "\015\012";
chomp; # Now removes Windows line endings
} # Revert $/ to original value
答案 1 :(得分:3)
出现此问题的原因是因为Perl的文件I / O方法已经过调整,可以与本地操作系统使用的行尾一起正常使用。当您读取使用不同行尾约定的文件(例如在* nix操作系统下处理Windows文本文件)时,可能会阻止chomp
正常工作。
作为perldoc中的第一句,chomp
“ 删除与$/
的当前值相对应的任何尾随字符串”。因此,如果您知道何时使用Windows文件以及何时使用* nix文件,则可以通过将$/
相应地设置为\n
来解决不同的OS行结束约定* nix用于Windows,\r\n
用于Windows。
如果您不知道给定文件使用的行尾约定,那么您将不得不使用正则表达式,例如$line =~ s/\r?\n\z//
。如果在您的情况下可以删除所有结尾的空格(而不仅仅是行尾),则$line =~ s/\s+\z//
将为您做到这一点,并可能在以后为您节省另一步。