多平台chomp处理unix,windows和mac文本文件

时间:2010-08-06 12:49:44

标签: perl

寻找一种方法来选择换行符,而不管创建文件的平台。

perlport#newlines指定的问题是每个平台上的换行符编码方式不同:

\ 012 unix

\ 015 \ 012 windows

\ 015 mac

但是,chomp是特定于平台的,只会删除正在运行的平台的字符,或$/变量设置的任何字符。

到目前为止,我提出了以下似乎有效的正则表达式:

# multiplatform chomp
s/\015?\012?$//;

这是正确的解决方案还是我错过了一些案例并且有更好的案例?

3 个答案:

答案 0 :(得分:2)

为什么不使用

 s/\s+$//;

答案 1 :(得分:1)

\ v匹配垂直空格,因此您应该可以使用

s/\v+$//;

但是,这假设您不介意删除换页和垂直标签等内容。

答案 2 :(得分:0)

如果你真的想要捕捉所有情况,那么你的正则表达式可以用于删除换行符。但是检查换行是否存在是不行的,它会很乐意匹配没有换行符的行。为此,你必须全力拼出。

m{(\015|\015\012|\012)\z};

请注意\z的使用。这是因为$将匹配将从捕获组窃取的行末尾的换行符。

实际上,您不必担心“Mac”换行符。 “Mac”换行符指的是OS X之前的MacOS。 非常 不太可能会遇到那个时代的文件,我说这是一个仍然有效的人Mac SE。所以你真正需要担心的是Windows和Unix新行。这通常是这样做的:

s{\015?\012\z}{};