use diagnostics; use strict; use warnings; use Data::Dumper ; my @randomParameters = ('Abc.123', '../../', 'a@b.c', '789'); my @allowedSymbols = ('.', '@'); my (@goodParams, @badParams); my @results = checkParam( \@randomParameters, ALPHA => 1, NUMERIC => 1, SYMBOLS => \@allowedSymbols ) ; print Dumper \@results ; sub checkParam { my ( $param_list, %options ) = @_ ; my %chartypes = ( 'ALPHA' => '[:alpha:]', 'NUMERIC' => '[:digit:]' ) ; my $regex = '[' ; ## include the character classes. $regex .= join '' => map { $chartypes{$_} } grep { $options{$_} } keys %chartypes ; ## include the symbols. $regex .= join '' => @{$options{'SYMBOLS'}} ; $regex .= ']+' ; my $pattern = qr/^$regex$/; my @results = ([], []) ; for ( @$param_list ) { if ( $_ =~ /$pattern/ ) { push @{$results[0]}, $_ ; } else { push @{$results[1]}, $_ ; } } return @results ; }