in reply to Delimiters in Regexp::Common

Use '\\' instead of '\/'

print "P2 has path\n" if ($P2 =~ /$RE{delimited}{-delim => '\\'}/ );

Replies are listed 'Best First'.
Re^2: Delimiters in Regexp::Common
by rongrw (Acolyte) on May 06, 2018 at 14:21 UTC

    Thank you. Yes, that certainly works for $P2.
    What I really wanted though was a single specification for "-delim =>" that uses back-slash OR forward-slash as delimiters.

    However, your suggestion has sparked an idea. It turns out that {-delim => '\\\/'} does indeed work for both cases. That's great!

    Cheers, Ron.

      Good to hear it works. I would have used a bracketed character class like [\\\/] but it turns out that a sequence of delimiters is treated as individual characters so that's unnecessary. It's in the docs now that I read them, so the rest of the post is partly for reference by my future self.

      print $RE{delimited}{-delim => 'ab'};

      gives

      (?:(?|(?:a)(?:[^\\a]*(?:\\.[^\\a]*)*)(?:a)|(?:b)(?:[^\\b]*(?:\\.[^\\b] +*)*)(?:b)))

      If one uses a character class then the square brackets are treated as delimiters.

      print $RE{delimited}{-delim => '[\\\/]'};

      gives

      (?:(?|(?:\[)(?:[^\\\[]*(?:\\.[^\\\[]*)*)(?:\[)|(?:\\)(?:[^\\]*(?:(?:\\ +\\)[^\\]*)*)(?:\\)|(?:\\)(?:[^\\]*(?:(?:\\\\)[^\\]*)*)(?:\\)|(?:\/)(? +:[^\\\/]*(?:\\.[^\\\/]*)*)(?:\/)|(?:\])(?:[^\\\]]*(?:\\.[^\\\]]*)*)(? +:\])))

      ...and a RegExp object appears to be stringified and then treated as a sequence of characters.

      print qr'a'; print "\n\n"; print $RE{delimited}{-delim => qr'a'}; print "\n";

      gives

      (?^:a) (?:(?|(?:\()(?:[^\\\(]*(?:\\.[^\\\(]*)*)(?:\()|(?:\?)(?:[^\\\?]*(?:\\. +[^\\\?]*)*)(?:\?)|(?:\^)(?:[^\\\^]*(?:\\.[^\\\^]*)*)(?:\^)|(?:\:)(?:[ +^\\\:]*(?:\\.[^\\\:]*)*)(?:\:)|(?:a)(?:[^\\a]*(?:\\.[^\\a]*)*)(?:a)|( +?:\))(?:[^\\\)]*(?:\\.[^\\\)]*)*)(?:\))))