sub do_dni {
my ( $filename ) = @_;
print "dni: $filename\n";
}
sub do_sni {
my ( $filename ) = @_;
print "sni: $filename\n";
}
my %dispatch = ( 'DNI' => \&do_dni,
'SNI' => \&do_sni,
# etc.
);
foreach my $fn ( @filenames ) {
while ( my ( $pattern, $sub_ref ) = each %dispatch ) {
$sub_ref->($fn) if ( $fn =~ /$pattern/ );
}
}
If you fear the regexes getting compiled over and over, you could also do something like this:
my @dispatch = ( { pattern => qr/DNI/,
coderef => \&do_dni, },
{ pattern => qr/SNI/,
coderef => \&do_sni, },
);
foreach my $fn ( @filenames ) {
foreach my $item ( @dispatch ) {
$item->{coderef}->($fn)
if ( $fn =~ $item->{pattern} );
}
}