Putter wondered on #perl6 if there was a way to write something that can be matched just like a regex and will set all the $1, $2, $&, @-, $+, $^N variables correctly. I was told the obvious things didn't work so I didn't try them :) and managed to get something close to a solution ($^N is wrong). Just to be clear the problem is to supply a $qr which sets all perl's regex vars yet could be using a different regex engine.
$str =~ $qr; print "$1, $2\n"; # or whatever
This code is proof of concept and has only been tested on the single instance shown.
#!/usr/bin/perl -w use strict; use re 'eval'; sub showvars ; my $s = "abcdefghi"; my (@a, $pos); print qq{"$s" =~ /(b)(.(.))/;\n}; #match($s, qr{(b)(.(.))}x ) and exit; # This doesn't set $^N correctly and we need to know the nesting # The rest of the regex vars should be ok if you know the number of pa +rens # If not then add braces up to $99, but $+, $#+ and the extra $n's wil +l be wrong match($s, qr/ (?{ $pos = 1; # pos if $& start # @a = your_fn($_) @a = ([0,3],[0,1],[1,2],[2,1]); # offset & length of captures # $a[0] is $&, $a[1] is $1, etc. # $a[1][0] is $-[0] and $a[1][1] is $+[0] - $-[0] }) # Capture $1: # Wrap this in (?= ) to not bump pos (?= (??{ qr!.{$a[1][0]}! }) # Advance to start of $1 ((??{ qr!.{$a[1][1]}! })) # Capture the right length ) # $2, $3, etc. (?= (??{ qr!.{$a[2][0]}! }) ((??{ qr!.{$a[2][1]}! })) ) (?= (??{ qr!.{$a[3][0]}! }) ((??{ qr!.{$a[3][1]}! })) ) # I think the parens are counted at regex compile time # so they need to be known in advance (or $+, $#+, $4 will be wron +g) # bump pos until where at the right spot (??{ (pos == $pos) ? qr{} : qr{(?!)}; }) # capture $& (??{ qr!.{$a[0][1]}! }) /xs ); sub match { my ($s, $qr) = @_; $s =~ $qr or die "No match $s =~ $qr"; showvars qw($` $& $'); showvars qw($+ $^N); showvars qw($1 $2 $3 $4 $5 $6); showvars qw(@-); showvars qw(@+); } sub showvars { no warnings 'uninitialized'; print "$_ = (",join(",",eval $_),") " for @_; print "\n"; } # $+ text of last sucessful match # $^N similar, but of last rightmost closing paren # @+ array or end pos, $+[0] is whole, $#+ is last good
The output is:
"abcdefghi" =~ /(b)(.(.))/; $` = (a) $& = (bcd) $' = (efghi) $+ = (d) $^N = (d) $1 = (b) $2 = (cd) $3 = (d) $4 = () $5 = () $6 = () @- = (1,1,2,3) @+ = (4,2,4,4)
Brad

In reply to Plug for an alternate regex engine by bsb

Title:
Use:  <p> text here (a paragraph) </p>
and:  <code> code here </code>
to format your post, it's "PerlMonks-approved HTML":



  • Posts are HTML formatted. Put <p> </p> tags around your paragraphs. Put <code> </code> tags around your code and data!
  • Titles consisting of a single word are discouraged, and in most cases are disallowed outright.
  • Read Where should I post X? if you're not absolutely sure you're posting in the right place.
  • Please read these before you post! —
  • Posts may use any of the Perl Monks Approved HTML tags:
    a, abbr, b, big, blockquote, br, caption, center, col, colgroup, dd, del, details, div, dl, dt, em, font, h1, h2, h3, h4, h5, h6, hr, i, ins, li, ol, p, pre, readmore, small, span, spoiler, strike, strong, sub, summary, sup, table, tbody, td, tfoot, th, thead, tr, tt, u, ul, wbr
  • You may need to use entities for some characters, as follows. (Exception: Within code tags, you can put the characters literally.)
            For:     Use:
    & &amp;
    < &lt;
    > &gt;
    [ &#91;
    ] &#93;
  • Link using PerlMonks shortcuts! What shortcuts can I use for linking?
  • See Writeup Formatting Tips and other pages linked from there for more info.