use strict; use warnings; my @grid = ( [ qw( a a b a c ) ], [ qw( a a a c f ) ], [ qw( a f c 1 b ) ], [ qw( a w x c z ) ], [ qw( a q q q c ) ], ); recognize( pattern => 'horizontal', min => 3 ); recognize( pattern => 'vertical', min => 5 ); recognize( pattern => 'diagonal', min => 2 ); sub recognize { my %config = @_; my $pattern = $config{pattern} // 'horizontal'; my $min = $config{min} // 3; my $reps = $min - 1; if ($pattern eq 'horizontal') { for my $row (0 .. $#grid) { my $string; $string .= $_ for $grid[$row]->@*; print "Found $pattern pattern '$&' in row $row\n" while $string =~ /(.)\1{$reps,}/g; } } elsif ($pattern eq 'vertical') { for my $col (0 .. $#{ $grid[0] }) { my $string; $string .= $_->[$col] for @grid; print "Found $pattern pattern '$&' in column $col\n" while $string =~ /(.)\1{$reps,}/g; } } elsif ($pattern eq 'diagonal') { my $string; $string .= $grid[$_][$_] for 0 .. $#grid; print "Found $pattern pattern '$&' in left-right diagonal\n" while $string =~ /(.)\1{$reps,}/g; my $col = $#grid; $string = ''; for my $row (0 .. $#grid) { $string .= $grid[$row][$col--]; } print "Found $pattern pattern '$&' in right-left diagonal\n" while $string =~ /(.)\1{$reps,}/g; } else { die "Unknown pattern '$pattern', stopped"; } }