7

良い時間です!perl に関する本を読んでいます: Larry Wall、Tom Christiansen、Jon Orwant による「Programming Perl」。この本では、著者によって明確にされていない (または単純にわからない) いくつかの例を見つけました。

最初

これは hi ONCE のみを出力します。

 "adfsfloglig"=~ /.*(?{print "hi"})f/;

しかし、これは "hi" TWICE?? を出力します。どのように説明できますか?

 "adfsfloglig"=~ /.*(?{print "hi"})log/;

そして、実験を続けると事態はさらに悪化します。

  "adfsfloglig"=~ /.*(?{print "hi"})sflog/;

上記のコード文字列は、この恐ろしい「こんにちは」を一度だけ出力します。約1週間後、私は1つのことだけを完全に理解しました-私は助けが必要です:)だから、私を助けてください.

2番目(これは爆弾です!)

 $_ = "lothiernbfj";

 m/        (?{$i = 0; print "setting i to 0\n"})
       (.(?{ local $i = $i + 1; print "\ti is $i"; print "\tWas founded $&\n" }))*
       (?{print "\nchecking rollback\n"})
       er
       (?{ $result = $i; print "\nsetting result\n"})
 /x;
 print "final $result\n";

ここで、$result最終的に画面に表示されるのは、一致した文字の数と同じですが.*、もう一度取得しません。

デバッグ印刷をオンにすると(上に表示)、$i新しい文字が含まれるたびにインクリメントされていることがわかります$&(文字列の一致した部分)。

最終的に$iは 11 (文字列内の文字の量) に等しく、7 回のロールバックがあり.*、一致する文字から一度に (7 回) 返されるため、すべてのパターンの一致が発生します。

しかし、魔法のように、結果は$i!の値に設定されます。そして、この値をどこにも減らしていませんでした! したがって$result、11 に等しいはずです。そうではありません。そして著者は正しかった。知っている。

この奇妙な perl コードを説明してもらえますか? 回答ありがとうございます。

4

2 に答える 2