Perl qw () и скобки [] - PullRequest
       6

Perl qw () и скобки []

3 голосов
/ 11 декабря 2019

У меня есть две директории с файлом в каждой:

$ ls -l "test dir["
-rw-r--r--  1 root  media     0B 11 Dec 16:53 .ignoreme

и

$ ls -l "test [dir]"
-rw-r--r--  1 root  media     0B 11 Dec 16:34 .ignoreme

, и я использую Perl для проверки существования файла ".ignoreme":

$ perl -e '$d="test dir["; print -e glob qq("$d"/.ignore*); print "\n";'
1 

, который работает, и

$ perl -e '$d="test [dir]"; print -e glob qq("$d"/.ignore*); print "\n";'

, который не работает.

Я предполагаю, что это связано с парой [], но яЯ не уверен относительно взаимодействия. Может кто-нибудь, пожалуйста, просветите меня. Я был бы благодарен за исправление также для соответствия $d, которое включает [].

1 Ответ

8 голосов
/ 11 декабря 2019

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 в документах указан список [] в качестве метасимволов, для класс символов .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...