3

Perling を使い始めてから 2 か月が経ちましたが、なぜこれが起こっているのか完全に行き詰まっています...

問題があれば、私はOSXを使用しています。

次のようなファイル内の行を変換しようとしています

2011 年 8 月 3 日 01:00 PDT、1.11

のような標準出力行に

XXX、20120803、0100、KWH、0.2809、A、YYY

私はファイルを読んでいるので、chomp各行が読み込まれた後にしたいのですchomp。私がそうしないchompと、印刷はうまくいきます(余分な改行を除いて...)。何が起きてる?

while(<SOURCE>) {
    chomp;
    my @tokens = split(' |,');     # @tokens now [08/03/2011, 01:00, PDT, 1.11]

    my $converted_date = convertDate($tokens[0]);
    my $converted_time = convertTime($tokens[1]);

print<<EOF;
$XXX, $converted_date, $converted_time, KWH, $tokens[3], A, YYY
EOF
}

そこにchomp呼び出しがあると、出力はすべて混同されます。

、A、YYY10803、0100、KWH、1.11

そこに呼び出しがなければ、chomp少なくとも正しい順序で印刷されますが、余分な新しい行があります:

XXX、20110803、0100、KWH、1.11
、A、YYY

chompそこに があると、最初の行の「上にある」改行を上書きするようなものであることに注意してください。自動フラッシュを追加しました$|=1;が、ここで他に何をすべきかわかりません。

考え?そして、事前に感謝します....

4

2 に答える 2

10

入力の行は CR LF で終わります。LFのみを削除しています。簡単な解決策は、代わりに次を使用することですchomp

s/\s+\z//;

dos2unixコマンド ライン ツールを使用してファイルを変換してから、Perl に渡すこともできます。

于 2012-05-24T14:14:08.560 に答える
1

問題は、DOSの行末があり、PerlのUnixビルドで実行されていることです。

これに対する1つの解決策は、を使用することPerlIO::eolです。インストールする必要があるかもしれませんがuse、プログラムに行は必要ありません。

その後、あなたは書くことができます

binmode ':raw:eol(LF)', $filehandle;

その後、ファイルの形式やソースに関係なく、読み取られた行は標準で終了します"\n"

于 2012-05-24T14:24:41.080 に答える