note
TheDamian
<p>Here's another approach, which I find clean and easy to maintain.</p>
<p>It uses named captures to label each alternative.
If the regex matches, the <em>named capture hash</em> (<code>%+</code>)
will have only a single key, which will be the label
of the alternative that matched.</p>
<p>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).</p>
<code>
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
</code>
1200434
1200434