簡體   English   中英

CR vs LF perl解析

[英]CR vs LF perl parsing

我有一個perl腳本,它解析一個文本文件,並將每行分解為一個數組。 當每一行都被LF終止時它工作正常,但當它們通過CR終止時,我的腳本處理不正確。 如何修改此行以解決此問題

my @allLines = split(/^/, $entireFile);

編輯:我的文件有一個混合的行,結尾是LF或結束CR它只是在CR結束時折疊所有行

Perl可以使用內置的:crlf crlf PerlIO層處理CRLF和LF行結尾:

open(my $in, '<:crlf', $filename);

將自動將CRLF行結尾轉換為LF,並保持LF行結尾不變。 但CR-only文件是奇怪的。 如果您知道該文件僅使用CR,那么您可以將$ /設置 "\\r" ,它將逐行讀取(但不會將CR更改為LF)。

如果必須處理未知行結尾的文件(甚至是單個文件中的混合行結尾),您可能需要安裝PerlIO :: eol模塊。 然后你可以說:

open(my $in, '<:raw:eol(LF)', $filename);

當您讀取文件時,它會自動將CR,CRLF或LF行結尾轉換為LF。

另一種選擇是將$/設置$/ undef ,這將在一個slurp中讀取整個文件。 然后將其拆分為/\\r\\n?|\\n/ 但是假設文件足夠小以適應內存。

如果您有混合行結尾,則可以通過匹配廣義行結尾來標准化它們:

 use v5.10;

 $entireFile =~ s/\R/\n/g;

您還可以在字符串上打開文件句柄並讀取行,就像在文件中一樣:

 open my $fh, '<', \ $entireFile;
 my @lines = <$fh>;
 close $fh;

您甚至可以使用cjm顯示圖層打開字符串。

在進行split ,您可以只處理不同的行結尾,例如:

my @allLines = split(/\r\n|\r|\n/, $entireFile);

如果使用<>讀取它會自動將輸入拆分為行,但是您需要將$/更改為\\r

$/是“輸入記錄分隔符”。 有關詳細信息,請參閱perldoc perlvar

沒有任何方法可以改變正則表達式認為的行尾 - 它始終是換行符。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM