無名サブルーチンをevalで作るわけね。
じゃあこんなのはどうかね。

my %opt_hash;

sub match {
my($str, $pattern, $opt) = @_;

unless (defined $opt_hash{$opt}) {
$opt_hash{$opt} =
eval qq{
sub {
my(\$s, \$pat) = @_;
\$s =~ /\$pat/$opt;
}
};
die $@ if $@;
}

$opt_hash{$opt}->($str, $pattern);
}