in reply to regex/substitution question

Using that approach, you'll also have problems with
my %subs = ( foo => 'bar', bar => 'baz', );

"foo" my end up being substituted with "baz".

You want to search for all regex in the same pass

s/(foo|bar)/$subs{$1}/g

And you want to search for the longest matches first.

s/(Xaa11|Xaa1)/$subs{$1}/g

So what you want is

my $pat = join '|', map quotemeta, sort { length($b) <=> length($a) } +keys(%subs); s/($pat)/$subs{$1}/g;

Alternatively, if you're always matching entire words, you could forgo the sorting in favour of using anchors.

my $pat = join '|', map quotemeta, keys(%subs); s/\b($pat)\b/$subs{$1}/g;

Replies are listed 'Best First'.
Re^2: regex/substitution question
by slugger415 (Monk) on Feb 07, 2012 at 19:32 UTC

    Excellent! Thank you. I've not used "map" before so will have to study that one.

    Regarding the use of \b, I'm wondering if my hash name contains a period at the end, what would happen? This seems to work fine but am I causing a potential problem? I guess my question is, since . is also a word boundary, might it leave it in in the substitution?

    %subs = ("Xaa1." => "sub1"); foreach $s (keys %subs){ $data =~ s/\b$e\b[.]?/$subs{$s}/g; }

    Anyway thanks much, this is very helpful.

    UPDATE:

    Ignore that last question. What I meant was, if $data contains a period after Xaa1, not the name in %subs. Here is my Xaa1. data string.

    But I think I'm asking a confusing question.. so please ignore. :-)

      I'm wondering if my hash name contains a period at the end, what would happen?

      Depends on what you expect to follow the period, but I'm betting it wouldn't be appropriate to use \b.