in reply to simple regex match question
People have already explained that regexp are different than shell matching.
If you're trying to get a list of files matching a file spec, use glob. Otherwise, you'll have to use a regexp.
If the pattern can be a regexp, the following will do fine:
if ($file =~ /\.txt\z/) { print("Match\n"); } else { print("No match\n"); }
If you need must be a file spec, the following will convert (rudimentary, as in just * and ?) file specs into a regexp:
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"); }
Don't forget that regexps are case-sensitive by default. Use /\.txt\z/i (first snippet) or qr/^$re_pattern\z/i (second snippet) to make the match case-insensitive.
|
|---|