对不起,如果这不值得堆叠溢出,但我很困惑。这是我的代码:
#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"; 对于那些不知道的人,$&显示正则表达式匹配。问题是第二个正则表达式似乎根本没有执行:最后一个print语句显示第一个正则表达式的所有值。您可能希望$&在这里进行修改。对吗?
我的测试数据是:$tmpData is: yo "WHACKREPLACEMENT-idname2"helloworld</whack>
在第一个正则表达式之后。$defaultData is: helloworld
我试着将这段代码从主脚本中提取出来,放到一个不严格的测试文件中,它起了作用:
怎么一回事?!谢谢!
编辑--我不知道如何更清楚地说明这一点,所以我想在出现错误时发布调试器的输出:
主语:(c:\exec\webwhack.pl:109):$tmpData =~ s/$defaultData$//;
DB<2> p $tmpData,$defaultData
"WHACKATAG2837293REPLACEMENT-idname2"removeMe
removeMe
DB<3> n
主语:(c:\exec\webwhack.pl:110):打印“发现1美元和2美元.$&‘\n”;
DB<3> p $tmpData,$defaultData
"WHACKATAG2837293REPLACEMENT-idname2"removeMe
removeMe
因此,您可以看到,进入正则表达式"removeMe“存在于字符串的末尾。从正则表达式中出来--好像什么都没变。:(
EDIT2
我还应指出,所有这些声明都是用以下文字包装的:
while( $tmpData =~ m/<\s*whack\s+([^\/>]*)(\/?>)/ig) { ... }循环播放
发布于 2011-11-09 07:33:07
很难准确地说没有$defaultData和$tmpData的值,但是当您的$defaultData模式在第二个=~中没有匹配时,您就会看到这一点。
毕竟,曼佩尔瓦说:
$&上一次成功的模式匹配匹配的字符串
我会这样构造它:
#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.
if($tmpData =~ s/$defaultData<\/whack>$//) {
print "FOUND $1 And $2... '$&'\n";
} else {
print "NOT FOUND";
}
}发布于 2011-11-09 07:40:33
我猜您的第一个替代操作正在更改$tmpData,因此第二个替代模式不匹配。
尽管如此,我认为您可以使用一个替代操作简化您的代码,如果您只是想像这样抓取您的照片中的内容:
if ($tmpdata =~ s/<whack>(.*?)<\/whack>/$1/) {
print "Found whack tag value: $tmpdata\n";
}更新:修正了斜杠
发布于 2011-11-09 07:41:07
为什么第二个正则表达式要执行?"WHACKREPLACEMENT-idname2"helloworld不以</whack>结尾。请记住,$1、$2和$&包含上次成功匹配的值,在您的示例中,这是第一个regexp。
$1、$2、$&和$tmpData之所以没有改变,是因为您的第二个regexp与$tmpData中的任何内容都不匹配。如果您修改了代码以显示相关代码,以便我们可以看到发生了什么,那么很容易指出原因。相反,你已经发布了更多无关的信息。
让我向您展示,在清楚发生了什么的情况下,贴出代码是多么容易:
#!/usr/bin/perl -w
use strict;
my $defaultData = "yo";
my $tmpData = "$defaultdata <whack id='IcedDante'>helloworld</whack>";
my $REPLACEMENTSTRING = "WHACKREPLACEMENT-idname";
#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";
}(我试图从你给我们的信息中重建你的代码,但这是不可能的。)
https://stackoverflow.com/questions/8061553
复制相似问题