my @patterns = qw/ foo bar baz /; ## if you need to return the pattern itself, return '$_' instead my $match_n_return = join( "\n", map{ "return \$1 if \$_[0] =~ /$_/o;" } @patterns ); my $sub = eval qq|sub { $match_n_return return undef }|; if( $@ ) { ## some syntax error in the eval string die $@ } my $matched = $sub->( "string you want to match" );