glob
интерпретирует пару []
как метасимволы для класса символов . † Это легко подтверждается простым экспериментом
mkdir zZ
touch zZ/f.txt
perl -wE'say for glob qq([az][bZ]/*)'
Это правильно перечисляет файл.
Тогда во втором случае в вопросе glob
вовсе не ищет каталог с литералом []
в его имени, но каталог с илиодин из d,i,r
символов, следующих за test␣
в его названии.
Одно из исправлений заключается в использовании \Q...\E
(см. quotemeta ) для того, чтобы избежать этих []
say for glob qq(\Q$d\E/.ignore*);
Это также экранирует пробелы по мере необходимости- но тогда он избегает и других вещей, поэтому вы не можете использовать подстановочные знаки (для одного) для того, что находится внутри последовательности. Это никогда не должно быть проблемой, так как в имени каталога не должно быть символов, предназначенных для использования в качестве подстановочных знаков, но полезно помнить об этом.
Другой вариант - экранировать специальные символы при формировании имени каталога. переменная
perl -wE'$d = quotemeta "test [dir]"; say for glob qq($d/*)'
, что теперь работает как обычно.
Нет необходимости использовать двойные кавычки, поскольку quotemeta
также заботится о пробелах.
† glob на странице написано
Этот оператор реализован с использованием стандартного расширения File::Glob
.
и File :: Glob в документах указан список []
в качестве метасимволов, для класс символов .