如何从行尾删除`\ n`字符?

时间:2019-06-25 10:27:02

标签: perl

Doc说:

  

排骨; #避免在最后一个字段上使用\ n

但是,如果文件具有Windows CRLF,则仅从末尾删除LF。

my $line =  <STDIN>;
print chomp $line;                 # 1
print map{ ord } split '', $line;  # 46 49 13

如何从末尾删除两个CRLF字符?

2 个答案:

答案 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//将为您做到这一点,并可能在以后为您节省另一步。