Ответ 1
Попробуйте следующее:
perl -MO=Lint -cw /path/to/script.pl
Здесь используется B:: Lint module.
Исходя из фона С++, я религиозно использую функции use strict
и use warnings
Perl:
#!/usr/bin/perl -w
use strict;
use warnings;
$foo = 1; #Throws "$foo" requires explicit package name error
foobar( 1 );
Конструкция use strict
очень полезна, чтобы ловить ошибки, когда вы ошибочно называете имя переменной. Есть ли эквивалентная конструкция для улавливания ошибочных имен функций? В приведенном выше примере было бы замечательно, если бы было что-то вроде perl -c
, которое обнаружило, что для вызова нет функции foobar. Конечно, при запуске script выдается ошибка Undefined, но я бы хотел раньше ее поймать.
Попробуйте следующее:
perl -MO=Lint -cw /path/to/script.pl
Здесь используется B:: Lint module.
Модуль Sub::StrictDecl выполняет то, что вы ищете, и с лексической областью.
Этот модуль предоставляет дополнительную проверку существования подпрограммы в время компиляции. Эта проверка обнаруживает ошибочные имена подпрограмм и подпрограмм, которые программист забыл импортировать. Традиционно Perl не обнаруживает эти ошибки до времени выполнения, поэтому для ошибок легко скрываться в редко исполняемом или непроверенном коде.
В частности, когда проверка включена, любая ссылка на конкретную (компиляционно-постоянная) имя подпрограммы на основе пакетов. Если именованная подпрограмма никогда не была объявлена, тогда ошибка сигнализируется во время компиляции. Это не требует, чтобы подпрограмма быть полностью определен: передовая декларация, такая как "sub foo;" достаточно для подавить ошибку. Импортированные подпрограммы квалифицируются как объявленные. Проверяемые ссылки включают не только вызовы подпрограмм, но и чистые ссылки, такие как "\ & foo".
Эта проверка контролируется лексически-облачной прагмой. это поэтому применяется только к коду, который явно хочет проверить, и при необходимости можно локально отключить проверку. проверка может потребоваться отключить для кода, который делает специальные меры например, поставить подпрограмму на место во время выполнения.
Наблюдение ikegami
Ответ напомнил мне, что perlcritic может идентифицировать необъявленные подписи, но вам нужно установить Perl::Critic::StricterSubs, который не является частью основного распределения Perl::Critic
.
perlcritic -4 mycode.pl
Подпрограмма "foobar" не объявляется и не импортируется явно строка 10, столбец 1. Это может быть основной ошибкой. (Уровень важности: 4)
Perl не может знать во время компиляции, что не будет подчиненного для вызова после достижения подзаголовка, поэтому -c
не может это вам сказать.
perlcritic
- это инструмент, предназначенный для сканирования кода Perl и угадывания возможных проблем, подобных этому. Правило Perl:: Critic:: StricterSubs perlcritic
проверяет эту проблему.