Как мне получить perl -c, чтобы выбросить ошибки Undefined или Undeclared?

Исходя из фона С++, я религиозно использую функции 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, но я бы хотел раньше ее поймать.

Ответ 1

Попробуйте следующее:

perl -MO=Lint -cw /path/to/script.pl

Здесь используется B:: Lint module.

Ответ 2

Модуль Sub::StrictDecl выполняет то, что вы ищете, и с лексической областью.

Этот модуль предоставляет дополнительную проверку существования подпрограммы в время компиляции. Эта проверка обнаруживает ошибочные имена подпрограмм и подпрограмм, которые программист забыл импортировать. Традиционно Perl не обнаруживает эти ошибки до времени выполнения, поэтому для ошибок легко скрываться в редко исполняемом или непроверенном коде.

В частности, когда проверка включена, любая ссылка на конкретную (компиляционно-постоянная) имя подпрограммы на основе пакетов. Если именованная подпрограмма никогда не была объявлена, тогда ошибка сигнализируется во время компиляции. Это не требует, чтобы подпрограмма быть полностью определен: передовая декларация, такая как "sub foo;" достаточно для подавить ошибку. Импортированные подпрограммы квалифицируются как объявленные. Проверяемые ссылки включают не только вызовы подпрограмм, но и чистые ссылки, такие как "\ & foo".

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

Ответ 3

Наблюдение ikegami Ответ напомнил мне, что perlcritic может идентифицировать необъявленные подписи, но вам нужно установить Perl::Critic::StricterSubs, который не является частью основного распределения Perl::Critic.

perlcritic -4 mycode.pl

Подпрограмма "foobar" не объявляется и не импортируется явно строка 10, столбец 1. Это может быть основной ошибкой. (Уровень важности: 4)

Ответ 4

Perl не может знать во время компиляции, что не будет подчиненного для вызова после достижения подзаголовка, поэтому -c не может это вам сказать.

perlcritic - это инструмент, предназначенный для сканирования кода Perl и угадывания возможных проблем, подобных этому. Правило Perl:: Critic:: StricterSubs perlcritic проверяет эту проблему.