Как получить perl -c для выдачи неопределенных или необъявленных ошибок функций? - PullRequest
10 голосов
/ 14 декабря 2011

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

Ответы [ 4 ]

13 голосов
/ 14 декабря 2011

Попробуйте это:

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

При этом используется модуль B :: Lint .

7 голосов
/ 14 декабря 2011

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

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

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

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

6 голосов
/ 14 декабря 2011

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

perlcritic -4 mycode.pl

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

2 голосов
/ 14 декабря 2011

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...