Sorry if this isn't Stack Overflow worthy but I'm stumped. Here is my code:
#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";
For those not aware, $&
shows the regex match. The problem is that the second regular expression appears to not be executing at all: the last print statement shows all the values from the first regular expression. You would expect $&
would modify here. Right?
My test data is: $tmpData is: yo "WHACKREPLACEMENT-idname2"helloworld</whack>
after the first regular expression.
$defaultData is: helloworld
I tried pulling this code out from the main script into a test file that isn't strict and it worked :(
What is going on?! Thanks!
EDIT I wasn't sure how to make this clearer so I thought I would post the output from my debugger at the point of error:
main::(c:\exec\webwhack.pl:109): $tmpData =~ s/$defaultData</whack>$//;
DB<2> p $tmpData, $defaultData
"WHACKATAG2837293REPLACEMENT-idname2"removeMe
removeMe
DB<3> n
main::(c:\exec\webwhack.pl:110): print "FOUND $1 And $2... '$&'\n";
DB<3> p $tmpData, $defaultData
"WHACKATAG2837293REPLACEMENT-idname2"removeMe
removeMe
So you can see that going into the regular expression "removeMe" exists at the end of the string. Coming out of the regular expression though- it's as if nothing changed. :(
EDIT2
I should also point out that all these statements are wrapped in a:
while( $tmpData =~ m/<\s*whack\s+([^\/>]*)(\/?>)/ig) { ... }
loop
Hard to say exactly with no values for $defaultData
and $tmpData
, but that would be what you see when your $defaultData
pattern isn't being matched in the second =~
.
After all, man perlvar says:
$& The string matched by the last successful pattern match
I'd structure it like this:
#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";
}
}