55

私は、さまざまなソースから入力を取得できるスクリプトを維持しており、行ごとに動作します。使用される実際のソースに応じて、改行は Unix スタイル、Windows スタイル、または集約された入力の場合は混合 (!) である場合もあります。

ファイルから読み取るときは、次のようになります。

@lines = <IN>;
process(\@lines);

...

sub process {
    @lines = shift;
    foreach my $line (@{$lines}) {
        chomp $line;
        #Handle line by line
    }
}

したがって、必要なことは、chomp を、Unix スタイルまたは Windows スタイルの改行を削除するものに置き換えることです。私はこれを解決する方法が多すぎると考えています.Perlの通常の欠点の1つです:)

一般的な改行をむさぼり食う最も巧妙な方法についてどう思いますか? 何が最も効率的でしょうか?

編集: ちょっとした説明 - メソッド 'process' は、必ずしもファイルから読み取るのではなく、どこかから行のリストを取得します。各行には

  • 末尾の改行なし
  • Unix スタイルの改行
  • Windows スタイルの改行
  • Just Carriage-Return (元のデータに Windows スタイルの改行があり、$/ = '\n' で読み取られる場合)
  • 線のスタイルが異なる集合セット
4

7 に答える 7

95

perlreのドキュメントを少し掘り下げた後、これまでのところかなりうまくいくと思われる私の最良の提案を提示します。Perl 5.10 は \R 文字クラスを一般化された改行として追加しました:

$line =~ s/\R//g;

以下と同じです:

(?>\x0D\x0A?|[\x0A-\x0C\x85\x{2028}\x{2029}])

提案されるのを待っているもっと気の利いた方法があるかどうかを確認するためだけに、この質問はまだしばらく開いたままにします.

于 2009-05-19T11:14:17.187 に答える
13

入力を実行して文字を削除または置換したいときはいつでも、このような小さなサブルーチンを実行します。

sub clean {

    my $text = shift;

    $text =~ s/\n//g;
    $text =~ s/\r//g;

    return $text;
}

派手ではないかもしれませんが、この方法は私にとって何年もの間完璧に機能しています。

于 2011-02-18T22:46:05.063 に答える
1

上記の Ted Cambron の回答と、ここで取り上げられていないものを拡張するには、入力されたテキストのチャンクからすべての改行を無差別に削除すると、後でそのテキストを出力するときに、段落がスペースなしで互いにぶつかってしまいます。これは私が使用するものです:

sub cleanLines{

    my $text = shift;

    $text =~ s/\r/ /; #replace \r with space
    $text =~ s/\n/ /; #replace \n with space
    $text =~ s/  / /g; #replace double-spaces with single space

    return $text;
}

最後の置換は g 'greedy' 修飾子を使用するため、すべてを置換するまでダブルスペースを検索し続けます。(単一のスペース以上のものを効果的に置き換える)

于 2016-08-19T13:40:54.533 に答える