用Perl处理文本文件时遇到的换行问题
来源:互联网 发布:足球教案制作软件 编辑:程序博客网 时间:2024/05/21 22:30
在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先把文件先转换一下。
- 用Perl处理文本文件时遇到的换行问题
- perl简单文本文件处理
- C#文本文件输出的换行问题
- 使用perl脚本语言处理文本文件
- perl 完成一个固定格式的文本文件处理
- datstage处理文本文件中存在多余换行符的数据
- Perl正则表达式处理换行
- perl 处理 回车 换行符
- C#中使用textbox时遇到的换行问题
- 用FlySaucer遇到的中文字体和换行问题
- perl 遇到的贪婪匹配的问题
- TortoiseCVS checkout文本文件时自动转换换行符问题
- goto语句遇到的问题 回车/换行
- Linux下用perl批量替换文本文件的内容
- vb 创建文本文件 有换行符问题
- java生成文本文件linux下换行问题
- 关于Perl对中文的处理问题
- 处理掉字母不能换行的问题
- 第七课:TTF字体的绘制
- java Class文件内部结构解析
- R语言学习 apply
- Ubuntu 12.04重启后resolv.conf清空的问题
- fastsocket优化网络性能原理
- 用Perl处理文本文件时遇到的换行问题
- KMP算法next数组计算方法的优化
- SourceInsight3.5添加库函数支持
- 苹果夜
- Fibonacci Sequences in JavaScript with/without recursive
- 盘点2014年度智慧城市:政策、标准及其它
- 正则表达式
- Linux文本处理工具之sed
- Direct3D 11 拾取