Perl区分文件换行符类型

背景

在Windows上使用Perl判断文件时何种换行符时,处理CR LF类型的换行符时,也识别成了LF。

思路

  1. Windows上的换行是 CRLF , Unix上是 LF , Mac CR
  2. 在Windows平台使用Perl读取文件创建文件句柄时,未对file handler设置binmode,了解到binmode模型作用是采用非二进制读取模式时,双字节换行符CR LF在读取时转换为LF,写入时将LF转换为CR LF。这对于使用双字节分隔文本文件行的操作系统(MS-DOS)至关重要,但对使用单个字符的操作系统(Unix,Mac OS,QNX)没有影响。
  3. chomp是去除每行行末的记录分隔符(record separator),这个分隔符的值是可以通过 perl内置变量 $/ (input record separators )来设置,默认情况下Windows和Linux上 $/ 的值都是 LF

处理

所以Perl脚本在读取DOS文本时,行末换行符CR LF 被自动转行成 LF ,此后去判断单行记录时,返回结果均是LF,未能正确识别出文件的换行符类型,基于此原因。修改代码如下(测试)

perl 复制代码
#!/usr/bin/perl

use strict;

my $path = '/export/script/perl_scripts';

my @files = qw /a.txt b.txt/;

my $newLine = '';

for my $f (@files)
{
    my $fullPath = sprintf "%s/%s",$path,$f;

    # 获取首行
    open(INFILE,$fullPath) or die "dont open this file ${fullPath}";

    # 此函数设置在操作系统上以二进制形式读取和写入FILEHANDLE的格式。
    # 采用非二进制读取模式时,双字节换行符CR LF在读取时转换为LF,写入时将LF转换为CR LF。
    # 这对于使用双字节分隔文本文件行的操作系统(MS-DOS)至关重要,但对使用单个字符的操作系统(Unix,Mac OS,QNX)没有影响。
    binmode(INFILE); # 设置二进制读取模式,保留文件中的原始换行符
    my $line = <INFILE>;
    close INFILE;

    if($line =~ '\r\n')
    {
        $newLine = 'CRLF';
        print "windows newline\n";
    }elsif($line =~ '\n')
    {
        $newLine = 'LF';
        print "linux newline\n";
    }elsif($line =~ '\r')
    {
        $newLine = 'CR';
        print "mac newline\n";
    }else
    {
        print "is a single line without newline\n";
    }
    print "${fullPath} newline is ${newLine}\n";

    # 采用如下去除换行符方式,替换chomp方法,可在任意平台处理任意换行符类型的文件
    $line =~ s/[\r\n]+\Z//g;

}
## 运行结果如下
# linux newline
# /export/script/perl_scripts/a.txt newline is LF
# windows newline
# /export/script/perl_scripts/b.txt newline is CRLF

思路源自:https://blog.csdn.net/fibonaccian/article/details/42168725

相关推荐
初九之潜龙勿用25 分钟前
C# 读取多条数据记录导出到 Word标签模板之图片输出改造
开发语言·c#·word
迷迭所归处1 小时前
C++ —— 以真我之名 如飞花般绚丽 - 智能指针
开发语言·c++
Code哈哈笑1 小时前
【Java 学习】构造器、static静态变量、static静态方法、static构造器、
java·开发语言·学习
是老余1 小时前
Java三大特性:封装、继承、多态【详解】
java·开发语言
小馒头学python2 小时前
【Python爬虫五十个小案例】爬取豆瓣电影Top250
开发语言·爬虫·python
尘浮生2 小时前
Java项目实战II基于微信小程序的南宁周边乡村游平台(开发文档+数据库+源码)
java·开发语言·数据库·spring boot·微信小程序·小程序·maven
wangjing_05224 小时前
C语言练习.if.else语句.strstr
c语言·开发语言
Tony_long74834 小时前
Python学习——字符串操作方法
开发语言·c#
SoraLuna5 小时前
「Mac玩转仓颉内测版26」基础篇6 - 字符类型详解
开发语言·算法·macos·cangjie
出逃日志5 小时前
JS的DOM操作和事件监听综合练习 (具备三种功能的轮播图案例)
开发语言·前端·javascript