Beefy Boxes and Bandwidth Generously Provided by pair Networks
go ahead... be a heretic
 
PerlMonks  

Re: Is there really no @LAST_MATCH_START equivalent for named capture groups?

by LanX (Canon)
on Jan 30, 2013 at 00:53 UTC ( #1015945=note: print w/ replies, xml ) Need Help??


in reply to Is there really no @LAST_MATCH_START equivalent for named capture groups?

Just an idea:

'%+' and '%-' are tied hashes, you may wanna dig into perlreapi and Tie::Hash::NamedCapture to find the capture group index corresponding to a name.

Otherwise you could use one of the RegEx parsing modules on the regex to associate name to index.

HTH.

Cheers Rolf


Comment on Re: Is there really no @LAST_MATCH_START equivalent for named capture groups?
Replies are listed 'Best First'.
Re^2: Is there really no @LAST_MATCH_START equivalent for named capture groups?
by LanX (Canon) on Jan 30, 2013 at 10:51 UTC
    > Otherwise you could use one of the RegEx parsing modules on the regex to associate name to index.

    It's a hack but it gives you a hash mapping each name to it's index:

    (see Dynamically inspecting Regex OP-Codes at runtime? for an explanation)

    use strict; use warnings; use Data::Dump; my $a=qr/(?<C>1)(?<D>2)(3)(?<A>4)/; my $parsing=parse_regex($a); # parse lines like ' 1: OPEN1 'C' (3)' my %named_captures = ($parsing =~ /^ \s{1,3}\d{1,3}:\s+ # token number OPEN(\d)[ ]'(\w+)' # group(nr) 'name' [ ]\(\d+\) # next token $ /xgm); my %index_named_capture = reverse %named_captures; dd \%index_named_capture; # OUTPUT { A => 4, C => 1, D +=> 2 } sub parse_regex { my $regex=shift; my $re_compilation; # First, save away STDERR open my $SAVEERR, ">&STDERR"; close STDERR; open STDERR, ">", \$re_compilation or die "What the hell?\n"; # Now dynamically recompile a new regex, saving debug_info to $re_co +mpilation eval <<'_code_'; use re 'debug'; my $b=qr/$regex(?:)/; _code_ # Now close and restore STDERR to original condition. close STDERR; open STDERR, ">&", $SAVEERR; return $re_compilation; }
    Careful: ATM this can't handle repeated names properly, for this you need to adjust the reverse part.

    Cheers Rolf

    UPDATES

    corrected typo in code

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://1015945]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others perusing the Monastery: (8)
As of 2015-07-29 23:10 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    The top three priorities of my open tasks are (in descending order of likelihood to be worked on) ...









    Results (269 votes), past polls