3

行区切り文字が CR のみのファイルを読み込もうとしています。Mac OS X と Perl v.5.8.8 を使用しています。このスクリプトは、すべての種類の行区切り文字 (CR、LF、CRLF) に対して、すべてのプラットフォームで実行する必要があります。

私の現在のコードは次のとおりです。

open(FILE, "test.txt");

while($record = <FILE>){
    print $record;
}

close(TEST);

これは現在、最後の行 (または最悪) のみを出力します。何が起こっている?明らかに、ファイルを変換したくありません。出来ますか?

4

2 に答える 2

20

特殊変数を使用して区切り文字を設定できます$/

local $/ = "\r" # CR, use "\r\n" for CRLF or "\n" for LF
my $line = <FILE>;

詳細については、 perldoc perlvarを参照してください。

あらゆる種類の改行で機能する別の解決策は、ファイル全体を一度に丸呑みしてから、正規表現を使用して行に分割することです。

local $/ = undef;
my $content = <FILE>;
my @lines = split /\r\n|\n|\r/, $content;

ただし、ファイルは完全にメモリに読み込まれるため、非常に大きなファイルではこれを行うべきではありません。$/ を未定義の値に設定すると、行区切り文字が無効になることに注意してください。つまり、ファイルの最後まですべてが読み取られます。

于 2010-06-10T20:06:10.187 に答える
1

ここで役立つ可能性のある、より一般的な問題を解決しました。

任意の行区切り文字 (CR/CRLF/LF) を使用して行ごとに大きなファイルを解析する方法ですが、事前に不明です。

「大きな」ファイルとは、ファイル全体を 1 つの変数に読み込むことができないことを意味します。ここで、関数 'detectEndOfLine' はファイルの名前を取得し、'\r' または '\n' のいずれかを返します。ファイルの末尾)。

my $file = "test.txt";
local $/ = detectEndOfLine($file);
open(IN, $file) or die "Can't open file \"$file\" for reading: $!\n";
while(<IN>) {
    s/\r\n|\n|\r$//;
    print "$_\n";
}

sub detectEndOfLine {
    my $file = $_[0];
    my $size = -s $file;
    print "\"$size\"\n";

    open(IN, $file) or die "Can't open file \"$file\" for reading: $!\n";
    for(my $i = $size; $i >= 0; --$i) {
        seek(IN, $i, 0);
        $_ = <IN>;
        my $sym = substr($_, 0, 1);
        return $sym if( $sym eq "\n" or $sym eq "\r" );
    }
    return undef;
}
于 2013-06-04T09:47:19.570 に答える