Это однострочный гольф. Флаг -e
означает выполнение остальной части командной строки в качестве программы. -l
включает автоматическую обработку конца строки.
Часть <.* *>
представляет собой глобус, содержащий два шаблона для расширения: .*
и *
.
Эта порция
(q=not =)
- это список, содержащий единственное значение - строку «not». q=...=
- это альтернативный разделитель строк, по-видимому, используемый потому, что одинарная кавычка используется для кавычек в одной строке.
Часть [...]
является индексом в этом списке. Значение нижнего индекса будет равно 0 (значение «не») или 1 (ничего, что печатается как пустая строка) в зависимости от результата этого сравнения:
2 == (()=<.* *>)
Здесь много чего происходит. Сравнение проверяет, возвращал ли глобус список точно из двух элементов (предполагается, что он равен .
и ..
), но как это сделать - сложно. Внутренние скобки обозначают пустой список. Присвоение этому списку помещает глобус в контекст списка, чтобы он возвращал все файлы в каталоге. (В скалярном контексте он будет вести себя как итератор и возвращать только по одному за раз.) Само присвоение оценивается в скалярном контексте (находящемся в правой части сравнения) и поэтому возвращает количество назначенных элементов.
Ведущий +
запрещает Perl анализировать список в качестве аргументов print
. Конечный .empty
объединяет строку «пусто» с тем, что вышло из списка (т. Е. Либо «нет», либо пустая строка).