一天中的好时光!我正在阅读一本关于 perl 的书:Larry Wall、Tom Christiansen、Jon Orwant 的“Programming Perl”。在这本书中,我发现了几个作者没有阐明的例子(或者我当时根本不明白)。
首先
这只会打印一次 hi。
"adfsfloglig"=~ /.*(?{print "hi"})f/;
但这会打印“嗨”两次??怎么解释?
"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 代码吗?感谢您的任何回答!