in reply to Regular expression Problem

As far as I can tell, those two regexes are identical: one as a plain match, and one as a substitution.

I'm guessing somebody is first testing to see if anything is found, and if it does, replace it.

Don't do that. Just plain s/// is enough, it won't do anything if nothing is found, so it's safe.

Now all you've got is needless repetition, and a source of errors if somebody does a bad job copy/pasting after the regex is updated.

Now, as far as what it's trying to match, it's hard to tell formatted like this, but it looks like somebody tried to match a string looking like "%TABLE ... %" with something (of a specific format) instead of the "...", and in that something, the string 'name="History' (plus something more) ought to be found.

Well: it is wrong. It'll most likely do a substitution on a larger string, spanning more than one such string, if the first one doesn't contain that substring. As a simple example: it'd match a string like "%TABLE% blah blah blah %TABLE name="History"(something)%" as a single match. I don't think that is what's intended.

Better would be to try in match the string in a first step, and in the substitution, see if it contains that substring. If it does: substitute; if it doesn't: leave the original matched string.

At the very least, you should forbid presence of a "%" character between the "%TABLE" and the "name=" parts.

Replies are listed 'Best First'.
Re^2: Regular expression Problem
by AnomalousMonk (Archbishop) on Jan 14, 2011 at 09:40 UTC
    As far as I can tell, those two regexes are identical: one as a plain match, and one as a substitution.
    I'm guessing somebody is first testing to see if anything is found, and if it does, replace it.
    Don't do that. Just plain s/// is enough, it won't do anything if nothing is found, so it's safe.

    And if it happens to be the case that the existence of a match is used to conditionally control more than just a substitution, the  s/// operator returns the number of substitutions done, or false if there is no match, so it works just fine as a conditional expression. See s/PATTERN/REPLACEMENT/msixpogce in perlop.

    >perl -wMstrict -le "my $str = 'foo'; ;; if ($str =~ s{ foo }{bar}xms) { print qq{substituted with $str}; } " substituted with bar