David Olbersen wrote: > I'm trying to move over a string and match two types of patterns, > call them A and B. B always matches A, and A never matches B. > > To work this out I decided that once I matched A on my input string, > it would be a good idea to remove what I matched from the string. > > As a trivial example, I do this: > > my( $a, $b, $c ) = $input =~ m/$A/o; > my $match = $&;
I presume $A contains some capturing parentheses to return three values per match? I wouldn't use the /o modifier until you find you need to optimise the program. > ... processing ... > > $input =~ s/$match//; > > This works great -- but not for all cases! It probably doesn't work when your match string contains regex metacharacters. my $match = quotemeta $&; would fix that. But using $& is a burden on Perl and to be avoided. You could simply write $input =~ s/$A//; my( $a, $b, $c ) = ($1, $2, $3); > > I perform regexs in processing, but that shouldn't matter since I > save $& directly when I want it, right? Right. But if you need to use the original value of the string (including the match substring) within the loop you can save it like this: (my $chopped = $input) =~ s/$A//; my( $a, $b, $c ) = ($1, $2, $3); ... processing ... $input = $chopped; > Is anything blatantly wrong? Is there a better way to do this? Does > anybody need more information? I get the idea that you're wanting to find all occurrences of either $A or $B within a target string, but avoiding matching $B within an occurrence of $A. Am I right? If so, you may make use of an alternation regex expression coupled with the /g modifier on the match operator. while ( $input =~ m/$A|$B/g ) { my( $a, $b, $c ) = ($1, $2, $3); ... processing ... } $A|$B will always match $A first if it can, while the /g will step through the input string executing the loop body for each match. No worries if this model doesn't fit your problem. HTH, Rob -- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]