【发布时间】:2016-05-11 07:22:43
【问题描述】:
今天早些时候我发布了一个类似的问题,其解决方案导致了一个新问题,-,-
好吧,故事是我希望 Perl 从文本中捕获 cmets,将它们存储在数组中,然后用新编号的 cmets 替换它们,比如原始 $txt:
//first comment
this is a statement //second comment
//third comment
more statements //fourth comment
我想将 4 个 cmets 推入一个数组,并获得新的 $txt ,例如:
//foo_0
this is a statement //foo_1
//foo_2
more statements //foo_3
我尝试了以下 Perl:
$i=0;
$j=0;
#while ($txt =~ s/(\/\/.*?\n)/\/\/foo_$i\n/gs) {
#while ($txt =~ s/(\/\/.*?\n)/\/\/foo_$i\n/s) {
#foreach ($txt =~ s/(\/\/.*?\n)/\/\/foo_$i\n/gs) {
foreach ($txt =~ s/(\/\/.*?\n)/\/\/foo_$i\n/s) {
if(defined $1) {
push (@comments, $1);
print " \$i=$i\n";
$i++
}
print " \$j=$j\n";
$j++;
}
print "after search & replace, we have \$txt:\n";
print $txt;
foreach (0..$#comments) {
print "\@comments[$_]= @comments[$_]";
}
在其中,我尝试了四种口味的“while/foreach (... s///gs)”,但它们都没有真正做到我想要的。
“foreach”语句只对文本起作用一次;更糟糕的是,“while”语句将进入无限循环,似乎新的“//foo_xx”内容被放回字符串中以进行进一步的搜索操作,使其成为无限迭代。奇怪的是,这么看似简单的查找替换机制,竟然会陷入死循环,还是有一些我不知道的明显技巧?
顺便说一句,我已经浏览了by highsciguy 的帖子。对他来说,“只需在上面的代码中用 foreach 替换 while 就可以了”;但对我来说,foreach 不起作用,我不知道为什么。
任何人有任何想法可以帮助我解决这个问题吗?谢谢~
【问题讨论】:
-
您应该始终使用
use strict; use warnings;,因为知道自己的错误总比不知道要好。 -
是的,3q 为您提供建议;我只是喜欢 perl 的松散和灵活的语法,从未意识到“严格警告”的重要性。我试试看。
-
当你开始使用它时,你就会开始明白你在做什么,你也会明白为什么有时事情不工作。老实说,不打开它们工作就像蒙着眼睛工作。
-
对。我会努力坚持下去。 3q~
标签: regex perl replace find infinite-loop