0

これがどのように起こっているのかわかりませんが、一致を行った後、私の perl 正規表現の一致が次の一致に更新されないようです。$& 変数と $1 変数を一致ごとに更新する代わりに、最初の変数でスタックします。

私はどこでも見てきましたが、これは非常にイライラすることがわかりました。

以下のデバッガーからの出力を参照してください。ご覧のとおり、最初の一致は意味がありますが、2 番目の一致は意味がありません。

ありがとう

  DB<79>  $riz =~ m{url=(.*?)Support};

  DB<80> p$&;
url="http://www.svartapelsin.se" draggingName="Bunny Camp Support
  DB<81> $riz =~ m{href=(.*artist?)};

  DB<82> p $&;
url="http://www.svartapelsin.se" draggingName="Bunny Camp Support
  DB<83>

更新: これは、「アーティスト」というテキストが文字列内にあることを示す別のサンプルですが、まだ見つかりません。$riz の値は巨大な HTML コードなので、投稿するのは大変です。

DB<103> $riz =~ m{url=(.*?)Support};

  DB<104> p $&;
url="http://www.svartapelsin.se" draggingName="Bunny Camp Support
  DB<105> $riz =~ m{artist};

  DB<106> p $&;
url="http://www.svartapelsin.se" draggingName="Bunny Camp Support
  DB<107> p  string.index($riz,"artist");
string105
  DB<108>

私の $riz は、このリンクのすべての HTML です http://itunes.apple.com/us/app/id385972277

ユーザーエージェントを利用する場合 iTunes/10.2 (Macintosh; U; PPC Mac OS X 10.2)


同じ $riz を使用した別の例を次に示します。

  DB<128>  $riz =~ m/.*/;

  DB<129> p $&;
url="http://www.svartapelsin.se" draggingName="Bunny Camp Support
  DB<130>
...
    DB<136> p substr $riz,0,20;
    <?xml version="1.0"
      DB<137>

つまり、これはばかげているだけではありませんか?$riz no の値を出力するだけでよいのでしょうか? ご覧のとおり、表示されているものとは異なります。また、どのように m/.*/ が有効な正規表現ではないのでしょうか?

4

3 に答える 3

2

$&一致が成功するたびに更新されます。一致が成功しない場合、$&は更新されず、以前の値が保持されます。$MATCHの変数を参照してくださいperlvar。(perldoc perlvarを検索$MATCH)

于 2012-06-13T13:34:49.877 に答える
1

これで問題ありません。$&最後に成功した正規表現が一致した文字列が含まれます。$rizの内容にの一致が含まれていないと仮定し/href=(.*artist?)/ます。正規表現一致の戻り値を確認する必要があります。

/artist?/またはのみに一致することを認識していますartistartis?

于 2012-06-13T13:35:34.360 に答える
1

perldebugこう言います

デバッガーによって認識されないコマンドは、現在のパッケージの Perl コードとして直接実行 (評価) されます。

上記の eval は暗黙のスコープによってバインドされていることに注意してください。その結果、新しく導入されたレキシカル変数または変更されたキャプチャ バッファの内容は、評価後に失われます。デバッガーは Perl を学習するのに適した環境ですが、同じスコープ内にあるはずの素材を使用して対話的に実験する場合は、1 行に詰め込んでください。

したがって、$&および$1その他の変数は、デバッガー コマンドの実行中にローカライズされ、コマンドが完了すると失われます。

あなたが使用することができます

$riz =~ m{url=(.*?)Support}; print $&, "\n"; print $1, "\n";

また

$riz =~ m{url=(.*?)Support}; ($and, $one) = ($&, $1);
p $and
p $one

ただし、これらの値を同じコマンド ラインに保持するものがないと、正規表現の比較が完了すると、それらの値は永久に失われます。

于 2012-06-13T17:29:46.230 に答える