On Aug 13, Jeff 'japhy/Marillion' Pinyan said:

>On Aug 13, ERIC Lawson - x52010 said:
>
>>It does change every instance (except the first) of \n%A in the scalar
>>into a semicolon, given a scalar containing, e.g.,
>
>Basically, it scrunches
>
>%A this
>%A that
>%A those
>
>into
>
>%A this;that;those

The logic such a solution requires is this:

"as long as we START with '%A ' and were preceded by a line that STARS
with '%A ', remove the '\n%A ' and replace it with a ';'"

This is difficult to do with a regex, since the "preceded by" requires a
look-behind, and you can't say (?<=%A .*\n), because look-behinds cannot
be a variable width (and .* is variable width).

So the solution I came up with was to reverse the string.  Then we are
dealing with look-aheads, which CAN be variable width.

  $_ = reverse;
  s/(.*) A%\n(?=.* A%)/$1;/g;
  $_ = reverse;

Ta da.  Let me explain that.

  1. reverse the string
  2. the regex:
     a. match text (store to $1)
     b. match " A%\n"
     c. AND BE SURE we're followed by ANOTHER "... A%" string
  3. replace this with the matched text and a semicolon
  4. reverse the string

This is a technique I have come to embrace.  I call it "sexeger" (because
it involves reversing regexes) and it makes things that used to be
impossible with a single regex possible.

The beauty of the look-ahead is that it makes sure it COULD match without
actually advancing in the string.  That makes this work.

-- 
Jeff "japhy" Pinyan      [EMAIL PROTECTED]      http://www.pobox.com/~japhy/
RPI Acacia brother #734   http://www.perlmonks.org/   http://www.cpan.org/
** Look for "Regular Expressions in Perl" published by Manning, in 2002 **


-- 
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to