8

CR / LFを使用してレコードを区切るファイルがありますが、個々のレコードにLFが含まれている場合があります。

while (<$in>)
{ 
    #extract record data
}

私は上記のようにこのコードを読み込もうとしていますが、これは(私が予想するように)LFのみを含むレコードを分割します。$/ただし、再割り当てによってこの問題が解決されると期待していましたが、1回の反復でファイル全体が読み取られるように見えます。

$/ = "\r\n";
while (<$in>)
{ 
    #extract record data
}

実用的な解決策を提案できる人はいますか?

WindowsでActivestatePerlを使用しています。

4

3 に答える 3

11

Windowsでは、perlは着信CRLF行末をLFのみに変換し、データをテキストとして読み込むことでCRLFとLFを区別できなくなります(perlport)。したがって、ファイルハンドルでbinmodeを使用して、バイナリモードでデータを読み取る必要があります。

binmode($in);

その後、入力レコード区切り文字を「\ 015 \ 012」に設定し、通常どおりレコードを読み込むことができます。

$/ = "\015\012";
while (<$in>) {
    ...
}

挨拶、マティアス

PS:現時点では、ローカルでテストする機会がないので、機能しない場合は後悔しています。

于 2012-07-09T09:37:22.037 に答える
5

に設定$/してみてください"\n"perlportの改行から:

Perlは\n、「論理的な」改行を表すために使用します。論理的なものは、使用しているプラ​​ットフォームによって異なります。MacPerlでは、\n常にを意味し\015ます。DOSish perlsでは、\n通常はを意味\012しますが、「テキスト」モードでファイルにアクセスする場合、perlは、読み取りまたは書き込みのどちらであるかに応じて、ファイル:crlfを(またはから)変換するレイヤーを 使用します。\015\012

于 2012-07-09T09:22:49.733 に答える
3

しばらく前にこれを試してください

binmode($in);
于 2012-07-09T09:24:00.703 に答える