in reply to Re: How do I reference repeated capture groups?
in thread How do I reference repeated capture groups?

Here the promised code for both approaches, using named captures.

NB: Using the same precompiled regexes each time.

use v5.12; use warnings; use Data::Dump; my $re_start = qr{(?<start>\w+)\s*}; my $re_repeat = qr{\s*(?<repeat>\d+)\s*}; my $str = 'a 1 2 3 b 4 5 6'; while ( $str =~ /\G$re_start/g ) { print "$+{start}: "; while ( $str =~ /\G$re_repeat/gc ) { print "$+{repeat} "; } print "\n"; } my @res; $str =~ / (?: $re_start (?{ push @res, $+{start} }) (?: $re_repeat (?{ push @res, $+{repeat} }) )* )* /gx; dd \@res;

a: 1 2 3 b: 4 5 6 ["a", 1, 2, 3, "b", 4, 5, 6]

Cheers Rolf
(addicted to the Perl Programming Language :)
Wikisyntax for the Monastery

edit

Replies are listed 'Best First'.
Re^3: How do I reference repeated capture groups?
by LanX (Saint) on Aug 13, 2022 at 21:15 UTC
    to meet these explicit requirements, here an altered version.

    NB: how similar those solutions look like in the end...

    use v5.12; use warnings; use Data::Dump; my $str = 'a 1 2 3 b 4 5 6'; my $re_start = qr{(?<start>\w+)\s*}; my $re_repeat = qr{\s*(?<repeat>\d+)\s*}; # --- approach 1 with \G and /gc my @res1; while ( $str =~ /\G$re_start/g ) { push @res1, [$+{start}]; while ($str =~ /\G$re_repeat/gc) { push @{ $res1[-1] }, $+{repeat}; } } dd \@res1; # --- approach 2 with embedded (?{CODE}) my @res2; $str =~ / (?: $re_start (?{ push @res2, [$+{start}] }) (?: $re_repeat (?{ push @{ $res2[-1] }, $+{repeat} }) )* )* /gx; dd \@res2;

    output
    [["a", 1, 2, 3], ["b", 4, 5, 6]] [["a", 1, 2, 3], ["b", 4, 5, 6]]

    Cheers Rolf
    (addicted to the Perl Programming Language :)
    Wikisyntax for the Monastery