my $re_pat = ''; for ($glob_pat) { /\G ([^?*\\]+) /xsgc && $re_pat .= quotemeta($1); /\G \? /xsgc && do { $re_pat .= '.'; redo }; /\G \* /xsgc && do { $re_pat .= '.*'; redo }; /\G \\(.) /xsgc && do { $re_pat .= quotemeta($1); redo }; /\G \Z /xsgc or redo; }