my $file_pattern = '.*'; my $re_pattern = ''; for ($file_pattern) { /\G \* /gcx && do { $re_pattern .= '.*'; redo }; /\G \? /gcx && do { $re_pattern .= '.'; redo }; /\G ([^*?]+) /gcx && do { $re_pattern .= quotemeta("$1"); redo }; } my $re = qr/^$re_pattern\z/; if ($file =~ $re) { print("Match\n"); } else { print("No match\n"); }