我有一个perl脚本,它解析一个文本文件,并将每行分解为一个数组.当每一行都被LF终止时它工作正常,但当它们通过CR终止时,我的脚本处理不正确.如何修改此行以解决此问题
my @allLines = split(/^/, $entireFile);
Run Code Online (Sandbox Code Playgroud)
编辑:我的文件有一个混合的行,结尾是LF或结束CR它只是在CR结束时折叠所有行
cjm*_*cjm 11
Perl可以使用内置的:crlf PerlIO层处理CRLF和LF行结束:
open(my $in, '<:crlf', $filename);
Run Code Online (Sandbox Code Playgroud)
将自动将CRLF行结尾转换为LF,并保持LF行结尾不变.但CR-only文件是奇怪的.如果您知道该文件仅使用CR,那么您可以设置$ / to "\r"并逐行读取(但不会将CR更改为LF).
如果必须处理未知行结尾的文件(甚至是单个文件中的混合行结尾),您可能需要安装PerlIO :: eol模块.然后你可以说:
open(my $in, '<:raw:eol(LF)', $filename);
Run Code Online (Sandbox Code Playgroud)
当您读取文件时,它会自动将CR,CRLF或LF行结尾转换为LF.
另一种选择是设置$/为undef,它将在一个啜食中读取整个文件.然后分开它/\r\n?|\n/.但是假设文件足够小以适应内存.
如果您有混合行结尾,则可以通过匹配广义行结尾来标准化它们:
use v5.10;
$entireFile =~ s/\R/\n/g;
Run Code Online (Sandbox Code Playgroud)
您还可以在字符串上打开文件句柄并读取行,就像在文件中一样:
open my $fh, '<', \ $entireFile;
my @lines = <$fh>;
close $fh;
Run Code Online (Sandbox Code Playgroud)