在Windows上用Perl对文本进行处理,用chomp去除行末的换行,一切运行的很好,把文本文件和程序放到Linux上运行就出问题了,在Linux上,换行没有被正确的去除掉。

查了不少文档,最终搞明白了这个奇怪的问题:

1. Windows上的换行是 \r\n , Unix上是 \n , Mac \r 。

2. 我要处理的文本是在Windows平台用Perl程序生成的, 生成文件的时候没有对file handler设置binmode,读取的时候也没有。

按照 http://www.perlmonks.org/?node=binmode 的说法,在Windows平台上,如果没有对file handle设置binmode, 读取的时候会自动把CR LF (也就是\r\n) 转换成 LF (也就是\n),反之,往文件中写的时候会把 LF 转换成CR LF。

3. chomp是去除每行行末的记录分隔符(record separator),这个分隔符的值是可以通过 perl内置变量 $/ (input record separators )来设置的,默认情况下 $/ 的值是 \n,这个在Windows和Linux上是一样的。

4.所以当程序在Windows上运行时,文件被读取时,每行末的 \r\n 被自动转行成了 \n ,chomp处理后,行末就没有 \r\n 了,可是到了Linux平台,原来Windows上生成的文件被读取出来时,行末是 \r\n , chomp只去掉 \n ,行末的\r 还在,这就导致了程序里面有些原来在Windows平台运行正常的正则匹配失败。


解决办法:

用 s/[\r\n]+\Z//g 来代替chomp,这样程序就可以跨平台运行了。


其他解决方法:

在linux平台上用dos2unix先把文件先转换一下。


Logo

更多推荐