my $line = q{Convention_9841_12345678901234.txt}; my @captures; print "\nIncorrect\n\n"; print_captures( incorrect( qr/Convention_(\d{4})_(\d{14})\.txt$/, $line ) ); print_captures( incorrect( qr/Convention_(\d{4})_\d{14}\.txt$/, $line ) ); print_captures( incorrect( qr/Convention_\d{4}_\d{14}\.txt$/, $line ) ); print_captures( incorrect( qr/Convention_((\d{4})_(\d{14}))\.txt$/, $line ) ); print_captures( incorrect( qr/^(.*Convention_(\d{4})_(\d{14})\.txt)$/, $line ) ); print "\nCorrect\n\n"; print_captures( get_captures( qr/Convention_(\d{4})_(\d{14})\.txt$/, $line ) ); print_captures( get_captures( qr/Convention_(\d{4})_\d{14}\.txt$/, $line ) ); print_captures( get_captures( qr/Convention_\d{4}_\d{14}\.txt$/, $line ) ); print_captures( get_captures( qr/Convention_((\d{4})_(\d{14}))\.txt$/, $line ) ); print_captures( get_captures( qr/^(.*Convention_(\d{4})_(\d{14})\.txt)$/, $line ) ); sub incorrect { my ($pattern, $line) = @_; my @captures; (@captures) = $line =~ m/$pattern/ or return; return @captures; } sub get_captures { my ($pattern, $line) = @_; $line =~ m/$pattern/ or return; return map {substr $line, $-[$_], $+[$_] - $-[$_]} (1 .. $#-); } sub print_captures { my @captures = @_; @captures ? print "captures: @captures\n" : print "no captures\n"; }