【发布时间】:2011-11-09 07:17:39
【问题描述】:
对不起,如果这不值得 Stack Overflow,但我很难过。这是我的代码:
#Search tmpData for a <whack> tag and replace with REPLACEMENTSTRING (this works)
$tmpData =~ s/<\s*whack\s+([^\/>]*)(\/?>)/"$REPLACEMENTSTRING"/i;
if($defaultData ne '') {
print "pre $1 And $2... '$&'\n";
#Search for data inside <whack> tag and closing tag </whack> and remove them.
$tmpData =~ s/$defaultData<\/whack>$//;
print "FOUND $1 And $2... '$&'\n";
对于那些不知道的人,$& 显示正则表达式匹配。问题是第二个正则表达式似乎根本没有执行:最后一个打印语句显示了第一个正则表达式的所有值。你会期望$& 会在这里修改。对吧?
我的测试数据是:$tmpData is: yo "WHACKREPLACEMENT-idname2"helloworld</whack>
在第一个正则表达式之后。
$defaultData is: helloworld
我尝试将这段代码从主脚本中提取到一个不严格的测试文件中并且它有效:(
这是怎么回事?!谢谢!
编辑 我不知道如何让这个更清楚,所以我想我会在错误点发布我的调试器的输出:
main::(c:\exec\webwhack.pl:109): $tmpData =~ s/$defaultData$//;
DB p $tmpData, $defaultData
“WHACKATAG2837293REPLACEMENT-idname2”removeMe
删除我
数据库 n
main::(c:\exec\webwhack.pl:110): print "FOUND $1 And $2... '$&'\n";
数据库 p $tmpData, $defaultData
“WHACKATAG2837293REPLACEMENT-idname2”removeMe
删除我
所以你可以看到进入正则表达式“removeMe”存在于字符串的末尾。虽然从正则表达式中出来 - 好像什么都没有改变。 :(
EDIT2
我还应该指出,所有这些语句都包含在一个:
while( $tmpData =~ m/<\s*whack\s+([^\/>]*)(\/?>)/ig) { ... }
循环
【问题讨论】:
-
发布时请考虑发布可复制的内容。我们不是神,不知道你的变量包含什么。
-
在我发布答案后,似乎对问题进行了一些细微的更改,这使其无效。我建议您发布整个相关代码,而不是其中的部分代码,并附上您对正在发生的事情的解释。目前无法提供任何有意义的帮助。
-
大家好,我没有对这个问题做任何“细微的改变”......你在说什么?很抱歉没有更详细地说明这一点 - 我将开始查看并了解如何澄清它。
-
那么我很抱歉。但是,这些修订并没有使任何事情变得更清楚。您应该在代码中包含变量初始化。事实上,如果没有严格和警告,您发布的代码甚至是无效的。