Нет, удаление ключевого слова sub
определенно не решение. Если вы измените это:
sub func($@) {
# ...
}
к этому:
func($@) {
# ...
}
perlcritic перестает жаловаться на прототип - но я думаю, что это просто сбой в perlcritic. Без ключевого слова sub
это больше не определение подпрограммы; это синтаксическая ошибка, как вы увидите, попытаетесь ли вы ее запустить или отметите perl -cw
. Задача Perlcritic не в том, чтобы проверить, является ли ваш код допустимым Perl; он, очевидно, предполагает, что это так, а затем предупреждает вас о проблемах стиля. Если вы введете недопустимый Perl, все ставки отключены.
В наши дни принято считать, что использование прототипов Perl обычно не очень хорошая идея.
Perlcritic основан на книге "Лучшие практики Perl" Дамиана Конвея. Раздел, начиная со страницы 194, называется «Не используйте прототипы подпрограмм».
Книга не является общедоступной, поэтому я не могу цитировать или ссылаться на раздел здесь, но у chromatic есть запись в блоге "Проблема с прототипами", в которой, среди прочего, говорится:
Основная проблема с прототипами заключается в том, что они ведут себя иначе, чем
большинство людей ожидают, когда впервые сталкиваются с ними. Прототипы могут меняться
парсинг последующего кода, и они могут привести типы
аргументы. Они не служат документацией для количества или типов
подпрограммы аргументов ожидают и не отображают аргументы в именованные
параметры.
Легко предположить, что прототипы Perl похожи на прототипы C, которые объявляют число и тип (ы) (и, возможно, имена) аргументов, которые ожидает функция. На самом деле они совсем другие. Их основная цель заключается в написании подпрограмм Perl, которые имитируют поведение встроенных функций, например, не сплющивая массивы в списки.
См. Также perldoc perlsub
:
Это все очень мощно, конечно, и должно использоваться только в
умеренность, чтобы сделать мир лучше.