我有一个perl脚本,它解析一个文本文件,并将每行分解为一个数组。 当每一行都被LF终止时它工作正常,但当它们通过CR终止时,我的脚本处理不正确。 如何修改此行以解决此问题
my @allLines = split(/^/, $entireFile);
编辑: 我的文件中有两行混合 结束LF或结束CR它只是在CR结束时折叠所有行
答案 0 :(得分:11)
Perl可以使用内置的:crlf
PerlIO图层处理CRLF和LF行结尾:
open(my $in, '<:crlf', $filename);
会自动将CRLF行结尾转换为LF,并保持LF行结尾不变。但CR-only文件是奇怪的。如果您知道该文件仅使用CR,那么您可以将$/设置为"\r"
,它将逐行读取(但不会将CR更改为LF)。< / p>
如果您必须处理未知行结尾的文件(甚至是单个文件中的混合行结尾),您可能需要安装PerlIO::eol模块。然后你可以说:
open(my $in, '<:raw:eol(LF)', $filename);
并在读取文件时自动将CR,CRLF或LF行结尾转换为LF。
另一种选择是将$/
设置为undef
,这将在一个啜食中读取整个文件。然后将其拆分为/\r\n?|\n/
。但是这假设文件足够小以适应内存。
答案 1 :(得分:5)
如果您有混合行结尾,则可以通过匹配广义行结尾来标准化它们:
use v5.10;
$entireFile =~ s/\R/\n/g;
您还可以在字符串上打开文件句柄,并像在文件中一样读取行:
open my $fh, '<', \ $entireFile;
my @lines = <$fh>;
close $fh;
您甚至可以使用layers that cjm shows打开字符串。
答案 2 :(得分:1)
您可以在执行split
时处理不同的行结尾,例如:
my @allLines = split(/\r\n|\r|\n/, $entireFile);
答案 3 :(得分:0)
如果您使用<>
阅读,它会自动将输入拆分为行,但您需要将$/
更改为\r
。
$/
是“输入记录分隔符”。有关详细信息,请参阅perldoc perlvar
。
没有任何方法可以改变正则表达式认为是行尾的内容 - 它始终是换行符。