【发布时间】:2013-07-20 07:56:02
【问题描述】:
一天的好时光! 我正在读一本关于 perl 的书:Larry Wall、Tom Christiansen、Jon Orwant 的“Programming Perl”。在这本书中,我发现了几个作者没有阐明的例子(或者我当时根本不明白)。
第一个
这只会打印一次 hi。
"adfsfloglig"=~ /.*(?{print "hi"})f/;
但这会打印两次“hi”??怎么解释?
"adfsfloglig"=~ /.*(?{print "hi"})log/;
继续尝试甚至让事情变得更糟:
"adfsfloglig"=~ /.*(?{print "hi"})sflog/;
上面的代码字符串再次只打印一次这个可怕的“hi”! 大约一周后,我只完全理解了一件事——我需要帮助:) 所以我请你帮助我,拜托。
第二个(这是炸弹!)
$_ = "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 代码吗? 感谢您的任何回答!
【问题讨论】:
-
也许
use re 'debug'可以帮助阐明这一点。 -
在回溯过程中“撤消”对本地人的更改解释了in the docs,很难总结更多。