BEGIN { my %mapping = split ' ', <<'END_OF_MAPS'; \* * \? ? \\ \\ \ \\ % \% _ \_ * % ? _ END_OF_MAPS my $mapping_match = join "|", reverse sort map quotemeta($_), keys %mapping; $mapping_match = qr/$mapping_match/; # compile once sub pattern_to_like_string { my $pattern = shift; # pattern made of * ? \ and non-specials $pattern =~ s/($mapping_match)/$mapping{$1}/g; return $pattern; } }