7 my ($orig_p, @orig_l) = ($pat, @l);
9 return $seen{$key} if defined $seen{$key};
10 # say "walk $pat | @l |";
12 my $rv = $pat =~ /#/ ? 0 : 1;
13 # say "walk $pat | @l | returns $rv";
14 return $seen{$key} = $rv;
20 if ($p1 =~ s/^[\#\?]{$n}(?:\?|$)//) {
21 $sum += walk($p1, @l);
23 last if $pat !~ s/^\?//;
25 # say "walk $orig_p | @orig_l | returns $sum";
26 return $seen{$key} = $sum;
31 my ($subp1, $list1) = @_;
32 my $key = "@$subp1|@$list1";
33 return $seen2{$key} if defined $seen2{$key};
38 # say "head @subp | @list";
41 my $first = shift @subp;
44 while ($lsum <= length $first) {
45 my $n = walk($first, @l);
46 if (!@subp && !@list) {
49 } elsif ($n && @subp) {
50 my $restn = head(\@subp, \@list);
58 # say "head @$subp1 | @$list1 | returns $sum";
59 return $seen2{$key} = $sum;
66 my ($pattern, $list) = split / /;
67 my @list = $list =~ /\d+/g;
69 $pattern = join('?', ($pattern) x 5);
73 $pattern = ".$pattern.";
74 $pattern =~ s/\.\.+/./g;
77 my @subp = split /\./, $pattern;
78 # say join('|', @subp);
80 my $s = head(\@subp, \@list);
81 say "$orig @list = $s";