Search code examples
regexperl

Perl Regular Expression is being ignored?


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


Solution

  • 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";
      } 
    }