use v5.12.0; use warnings; use Data::Dump qw/pp dd/; use Data::Dumper; my $time = '"2$X:1$X:0$X "'; my $str = ""; for my $X (1..3) { $str .= eval($time); } say $str; my ($res,@res) ; my %CTX= ( VOID => { LHS => '' , RES => undef }, SCALAR => { LHS => '$res =', RES => \$res }, LIST => { LHS => '@res =', RES => \@res }, ); my %REGEX = ( "GROUPS_NO" => '2.:1.:0.', "GROUPS_YES" => '(2.):(1.):(0.)' ); my %got; my $ctxt_cnt = 0; for my $ctx (qw/SCALAR LIST VOID/) { for my $groups ( map "GROUPS_$_", qw/YES NO/ ) { for my $mod ("","g") { my $LHS = $CTX{$ctx}{LHS}; my $REGEX = $REGEX{$groups}; my $code = "$LHS ( \$str =~ /$REGEX/$mod );"; eval($code); my $ref = $CTX{$ctx}{RES} ; my $type = ref $ref; my $res = $type eq "SCALAR" ? $$ref : $type eq "ARRAY" ? [ @$ref ] : undef; pp { context => $ctx, code => $code, mod => $mod, result => $CTX{$ctx}{RES} }; $got{$ctx}{"MOD_$mod"}{$groups} = $res ; } } $ctxt_cnt++; } $Data::Dumper::Indent=1; $Data::Dumper::Terse =1; say Dumper \%got; #pp \%got;