Как делает этот Perl один лайнер, чтобы проверить, является ли каталог пустой работой?

единственные инструкции по кодированию, которые я видел предложенный для этого, должны поместить поля наверху определения класса.

я склонен помещать конструкторов затем.

мое замечание общего порядка было бы то, что необходимо придерживаться одного класса на файл и если класс является достаточно большим, что организация свойств по сравнению с методами является большим беспокойством, насколько большой класс, и необходимо ли осуществлять рефакторинг его так или иначе? это представляет несколько проблем?

5
задан Sinan Ünür 14 July 2009 в 15:50
поделиться

5 ответов

Это однострочник в гольф. Флаг -e означает выполнение остальной части командной строки как программы. -l включает автоматическую обработку конца строки.

Часть <. * *> - это глобус, содержащий два шаблона для расширения: . * и * .

Эта часть

(q=not =)

представляет собой список, содержащий единственное значение - строку «не». q = ... = - альтернативный разделитель строк, по-видимому, используемый потому, что однострочные кавычки используются для заключения однострочных кавычек.

] является нижним индексом в этом списке. Значение нижнего индекса будет либо 0 (значение «не»), либо 1 (ничего, выводится как пустая строка) в зависимости от результата этого сравнения:

2 == (()=<.* *>)

Здесь много чего происходит. Сравнение проверяет, вернул ли glob список ровно из двух элементов (предполагается, что это . и .. ), но как это сделать, сложно. Внутренние круглые скобки обозначают пустой список. Назначение этому списку помещает глобус в контекст списка, так что он возвращает все файлы в каталоге. (В скалярном контексте он будет вести себя как итератор и возвращать только один за раз.) Само присвоение оценивается в скалярном контексте (находясь в правой части сравнения) и, следовательно, возвращает количество назначенных элементов.

Начальное значение + предназначено для предотвращения Perl от анализа списка в качестве аргументов для print . Завершающий .empty объединяет строку «пустая» со всем, что вышло из списка (т.е. либо «не», либо пустой строкой).

16
ответ дан 18 December 2019 в 05:55
поделиться
<.* *>

- это глобус, состоящий из двух шаблонов: . * - все имена файлов, начинающиеся с . и * соответствует всем файлам (это отличается от обычных соглашений DOS / Windows).

(()=<.* *>)

оценивает глобус в контексте списка, возвращая все совпадающие имена файлов.

Затем сравнение с 2 помещает его в скалярный контекст, поэтому 2 сравнивается с количество возвращенных файлов. Если это число 2 , то единственными записями каталога являются . и .. , период. ; -)

7
ответ дан 18 December 2019 в 05:55
поделиться

<. * *> означает (glob (". *"), Glob ("*")) . glob расширяет шаблоны файлов так же, как и оболочка.

3
ответ дан 18 December 2019 в 05:55
поделиться

Я обнаружил, что модуль B :: Deparse очень помогает в расшифровке некоторых вещей, которые бросают глаза большинству программистов, например, q =. .. = construct:

$ perl -MO=Deparse,-p,-q,-sC 2>/dev/null << EOF
> print+(q=not =)[2==(()=<.* *>)].empty
> EOF
use File::Glob ();
print((('not ')[(2 == (() = glob('.* *')))] . 'empty'));

Конечно, это не дает мгновенно "читаемый" код, но определенно преобразует некоторые из препятствий.

2
ответ дан 18 December 2019 в 05:55
поделиться

Документация по этой функции находится здесь . (Прокрутите в конце раздела)

0
ответ дан 18 December 2019 в 05:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: