2

ファイルを開いて特定の行に一致させ、その行にHTMLタグをラップしようとしています。非常に単純なようですが、どうやら私は何かが欠けていて、Perlの一致したパターン変数を正しく理解していません。

私はこれと線を一致させています:

$line =~ m/(Number of items:.*)/i;

これにより、行全体が$1になります。次に、次のように新しい行を印刷しようとします。

print "<p>" . $1 . "<\/p>;

私はそれがこれを印刷することを期待しています:

<p>Number of items: 22</p>

しかし、私は実際にこれを取得しています:

</p>umber of items: 22

各ビットを別々の行に印刷する、$ 1を新しい変数に設定する、$ +と$&を使用するなど、あらゆる種類のバリエーションを試しましたが、常に同じ結果が得られます。

私は何が欠けていますか?

4

3 に答える 3

9

一致する\rがあります。これを印刷すると、出力が正しくなくなります。

編集: さらに説明すると、ファイルにウィンドウスタイルの\ r\n行末がある可能性があります。chompは\rを削除しません。これにより、貪欲な一致に丸呑みされ、不快な出力が発生します(\ rは、行の先頭に戻って印刷を続行することを意味します)。

次のようなものを追加することで\rを削除できます

$line =~ tr/\015//d;
于 2011-01-05T21:19:41.747 に答える
3

いかに危険であるかを (今後の参考のために) 学習しました.*

似たような不快なことに頭を悩ませてきたので、最近は、何を捉えようとしているのかについて、できる限り正確になりたいと思っています。多分

$line =~ m/(Number of items:\s+\d+)/;

そうすれば、そもそも問題のある制御文字をキャプチャしないと確信しています。Cygwin が Windows ファイルに対して何をしていようと、私は幸せなことに無知でいられます。

于 2011-01-05T22:31:06.183 に答える
3

問題を示す完全なコード スニペットを提供できますか? 私はそれを見ていません。

注意すべきことの 1 つは、$1 とその友人が、そのダイナミック スコープで最後に成功したマッチからのキャプチャを参照することです。一致を使用する前に、一致が成功することを常に確認する必要があります。

$line = "Foo Number of items: 97\n";
if ( $line =~ m/(Number of items:.*)/i ) {
    print "<p>" . $1 . "<\/p>\n";
}
于 2011-01-05T21:15:25.693 に答える