use strict; use warnings; use feature 'state'; use Test::More tests => 2; my @scenarios = ( # String Expected match ["Link:1625 housing Link:2004", ['1625', '2004' ]], ["Link:638 92-5000|Link:63892-5070", ['638 92-5000', '63892-5070']], ); my $pattern = qr/\d+ (?: [- ]\d+ )* /x; foreach my $scenario (@scenarios) { state $i = 1; my $str = $scenario->[0]; my @matches = $str =~ m/Link: ($pattern)/gx; is_deeply( \@matches, $scenario->[1], "Scenario $i"); $i++; } #### OUTPUT: 1..2 ok 1 - Scenario 1 ok 2 - Scenario 2