http://qs321.pair.com?node_id=1200490


in reply to Pattern Identification

Here's another approach, which I find clean and easy to maintain.

It uses named captures to label each alternative. If the regex matches, the named capture hash (%+) will have only a single key, which will be the label of the alternative that matched.

This approach should be reasonably fast but, as others have said, you'll definitely need to benchmark to find the most efficient solution (which might even vary depending on which version of Perl you're running).

use 5.010; use strict; use warnings; my $CLASSIFIER = qr{ (?<date> \d{2}.\d{2}.\d{2} ) | (?<date> \d{2}.\d{2}.\d{4} ) | (?<RMTTC> [A-Z]{2}\d{9}[A-Z]{2} ) | (?<Visa> \d{16} ) | (?<EAN13> \d{13} ) }x; while (my $input = <DATA>) { chomp $input; my $answer = $input =~ /^$CLASSIFIER$/ ? (keys %+)[0] : 'unknown'; print "$input is $answer\n"; } __DATA__ 12 12 17 09 30 2O17 09 30 2017 09 30 12017 123123123123123 1231231231231231 12312312312312312 456456456456 4564564564567 45645645645678 QW123456789WQ