единственные инструкции по кодированию, которые я видел предложенный для этого, должны поместить поля наверху определения класса.
я склонен помещать конструкторов затем.
мое замечание общего порядка было бы то, что необходимо придерживаться одного класса на файл и если класс является достаточно большим, что организация свойств по сравнению с методами является большим беспокойством, насколько большой класс, и необходимо ли осуществлять рефакторинг его так или иначе? это представляет несколько проблем?
Это однострочник в гольф. Флаг -e
означает выполнение остальной части командной строки как программы. -l
включает автоматическую обработку конца строки.
Часть <. * *>
- это глобус, содержащий два шаблона для расширения: . *
и *
.
Эта часть
(q=not =)
представляет собой список, содержащий единственное значение - строку «не». q = ... =
- альтернативный разделитель строк, по-видимому, используемый потому, что однострочные кавычки используются для заключения однострочных кавычек.
] является нижним индексом в этом списке. Значение нижнего индекса будет либо 0 (значение «не»), либо 1 (ничего, выводится как пустая строка) в зависимости от результата этого сравнения:
2 == (()=<.* *>)
Здесь много чего происходит. Сравнение проверяет, вернул ли glob список ровно из двух элементов (предполагается, что это .
и ..
), но как это сделать, сложно. Внутренние круглые скобки обозначают пустой список. Назначение этому списку помещает глобус в контекст списка, так что он возвращает все файлы в каталоге. (В скалярном контексте он будет вести себя как итератор и возвращать только один за раз.) Само присвоение оценивается в скалярном контексте (находясь в правой части сравнения) и, следовательно, возвращает количество назначенных элементов.
Начальное значение +
предназначено для предотвращения Perl от анализа списка в качестве аргументов для print
. Завершающий .empty
объединяет строку «пустая» со всем, что вышло из списка (т.е. либо «не», либо пустой строкой).
<.* *>
- это глобус, состоящий из двух шаблонов: . *
- все имена файлов, начинающиеся с .
и *
соответствует всем файлам (это отличается от обычных соглашений DOS / Windows).
(()=<.* *>)
оценивает глобус в контексте списка, возвращая все совпадающие имена файлов.
Затем сравнение с 2
помещает его в скалярный контекст, поэтому 2
сравнивается с количество возвращенных файлов. Если это число 2
, то единственными записями каталога являются .
и ..
, период. ; -)
<. * *>
означает (glob (". *"), Glob ("*"))
. glob
расширяет шаблоны файлов так же, как и оболочка.
Я обнаружил, что модуль 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'));
Конечно, это не дает мгновенно "читаемый" код, но определенно преобразует некоторые из препятствий.
Документация по этой функции находится здесь . (Прокрутите в конце раздела)