in reply to Re^2: Splitting on escapable delimiter
in thread Splitting on escapable delimiter

Nope, that returns an extra (empty) field most of the time, and there's no way to know when. For example, 'a@b' incorrectly returns 3 fields, although 'a@' correctly returns 2.

Replies are listed 'Best First'.
Re^4: Splitting on escapable delimiter
by Roy Johnson (Monsignor) on Mar 31, 2008 at 19:55 UTC
    That's weird. I'm trying to figure out why mine takes another pass after encountering end of string (even if I specify that the separator can be end-of-string). Meanwhile, I'll point out that your method finds only one field in '@' (instead of two empty ones — if there's no newline after the @).

    Update: this seems to work:

    my @pieces = /(?:^|\G@)((?:#.|[^@])*)/sg;
    Still don't know why I couldn't get it to realize it had hit end of string. My guess is, if end-of-string is not required to match, it takes another shot to make sure nothing matches.

    Caution: Contents may have been coded under pressure.

      Still don't know why I couldn't get it to realize it had hit end of string

      It's seen as somewhat of a bug. It happens when the search expression can match a zero length string. In the followig, the parens indicate what the three passes of your earlier s/// matches:

      (a@)(b)()

      Or in terms of @- and @+:
      pass@-@+
      102
      223
      333

      The /g loop ends when the fourth pass matches the same thing as the third pass and pos+1 is beyond the end of the string.