+------------+-----------+----------+----------+--------------+
| | SCALAR / VOID | LIST |
| m/REGEX/ +-----------+----------+-----------+-------------+
| | | (groups) | | (groups) |
+------------+-----------+----------+-----------+-------------+
| / | ->BOOLEAN | ->COUNT | ->BOOLEAN | ->CAPTURES |
| /g | ->BOOLEAN | ->COUNT | ->BOOLEAN | ->CAPTURES |
+------------+-----------+----------+-----------+-------------+
####
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;
####
{
code => "\$res = ( \$str =~ /(2.):(1.):(0.)/ );",
context => "SCALAR",
mod => "",
result => \1,
}
{
code => "\$res = ( \$str =~ /(2.):(1.):(0.)/g );",
context => "SCALAR",
mod => "g",
result => \1,
}
{
code => "\$res = ( \$str =~ /2.:1.:0./ );",
context => "SCALAR",
mod => "",
result => \1,
}
{
code => "\$res = ( \$str =~ /2.:1.:0./g );",
context => "SCALAR",
mod => "g",
result => \1,
}
{
code => "\@res = ( \$str =~ /(2.):(1.):(0.)/ );",
context => "LIST",
mod => "",
result => [21, 11, "01"],
}
{
code => "\@res = ( \$str =~ /(2.):(1.):(0.)/g );",
context => "LIST",
mod => "g",
result => [23, 13, "03"],
}
{
code => "\@res = ( \$str =~ /2.:1.:0./ );",
context => "LIST",
mod => "",
result => [1],
}
{
code => "\@res = ( \$str =~ /2.:1.:0./g );",
context => "LIST",
mod => "g",
result => ["21:11:01", "22:12:02", "23:13:03"],
}
{
code => " ( \$str =~ /(2.):(1.):(0.)/ );",
context => "VOID",
mod => "",
result => undef,
}
{
code => " ( \$str =~ /(2.):(1.):(0.)/g );",
context => "VOID",
mod => "g",
result => undef,
}
{
code => " ( \$str =~ /2.:1.:0./ );",
context => "VOID",
mod => "",
result => undef,
}
{
code => " ( \$str =~ /2.:1.:0./g );",
context => "VOID",
mod => "g",
result => undef,
}
21:11:01 22:12:02 23:13:03
{
'LIST' => {
'MOD_' => {
'GROUPS_NO' => [
1
],
'GROUPS_YES' => [
'21',
'11',
'01'
]
},
'MOD_g' => {
'GROUPS_NO' => [
'21:11:01',
'22:12:02',
'23:13:03'
],
'GROUPS_YES' => [
'23',
'13',
'03'
]
}
},
'SCALAR' => {
'MOD_g' => {
'GROUPS_YES' => 1,
'GROUPS_NO' => 1
},
'MOD_' => {
'GROUPS_NO' => 1,
'GROUPS_YES' => 1
}
},
'VOID' => {
'MOD_g' => {
'GROUPS_NO' => undef,
'GROUPS_YES' => undef
},
'MOD_' => {
'GROUPS_YES' => undef,
'GROUPS_NO' => undef
}
}
}
####
DB<36> @res = ( $str =~ /(2.):(1.):(0.)/g )
DB<37> x @res
0 21
1 11
2 01
3 22
4 12
5 02
6 23
7 13
8 03
DB<38>