Как проверить, нет ли в Perl script ошибок компиляции?
Я вызываю много скриптов Perl в моем Bash script (иногда также из csh).
В начале Bash script я хочу поставить тест, который проверяет, не лишены ли все скрипты Perl каких-либо ошибок компиляции.
Одним из способов сделать это было бы на самом деле вызвать Perl script из Bash script и grep
для "ошибки компиляции" в файле журнала каналов, но это становится беспорядочным, поскольку разные скрипты Perl вызывается в разных точках кода, поэтому я хочу сделать это в самом начале Bash script.
Есть ли способ проверить, не имеет ли Perl script ошибки компиляции?
Ответы
Ответ 1
Осторожно!!
Использование команды ниже для проверки ошибок компиляции в вашей программе Perl может быть опасным.
$ perl -c yourperlprogram
Рэндал написал очень хорошую статью по этой теме, которую вы должны проверить
Цитата из его статьи:
Наверное, самая простая вещь, которую мы можем сказать, - "она действительна?". Для этого, мы вызываем perl самостоятельно, передавая ключ только для компиляции:
perl -c ourprogram
Для этой операции perl компилирует программу, но останавливается только на этапе выполнения. Это означает, что каждый часть текста программы переводится во внутренние данные структура, представляющая рабочую программу, но мы на самом деле не выполнил любой код. Если есть какие-либо синтаксические ошибки, нам сообщают, и компиляция прерывается.
Собственно, это немного ложь. Благодаря блокам BEGIN (включая их многоуровневый кузен, директива по использованию), некоторый код Perl может иметь был выполнен во время этой теоретически безопасной "проверки синтаксиса". Для Например, если ваш код содержит:
BEGIN { warn "Hello, world!\n" }
то вы увидите это сообщение, даже во время perl -c! Это несколько удивительно для людей, которые "компилировать только" означает "не выполняет никакого кода". Рассмотрим код, который содержит:
BEGIN { system "rm", "-rf", "/" }
и вы увидите проблему с этот аргумент. К сожалению.
Ответ 2
Помимо perl -c program.pl
, также лучше найти предупреждения с помощью команды:
perl -w program.pl
Подробнее см.: http://www.perl.com/pub/2004/08/09/commandline.html
Ответ 3
Я использую часть функции bash для более крупных проектов perl:
# foreach perl app in the src/perl dir
while read -r dir ; do
echo -e "\n"
echo "start compiling $dir ..." ;
cd $product_instance_dir/src/perl/$dir ;
# run the autoloader utility
find . -name '*.pm' -exec perl -MAutoSplit -e 'autosplit($ARGV[0], $ARGV[1], 0, 1, 1)' {} \;
# foreach perl file check the syntax by setting the correct INC dirs
while read -r file ; do
perl -MCarp::Always -I `pwd` -I `pwd`/lib -wc "$file"
# run the perltidy inline
# perltidy -b "$file"
# sleep 3
ret=$? ;
test $ret -ne 0 && break 2 ;
done < <(find "." -type f \( -name "*.pl" -or -name "*.pm" \))
test $ret -ne 0 && break ;
echo "stop compiling $dir ..." ;
echo -e "\n\n"
cd $product_instance_dir ;
done < <(ls -1 "src/perl")
Ответ 4
Когда вам нужно проверить ошибки/предупреждения перед запуском, но ваш файл зависит от нескольких других файлов, вы можете добавить опцию -I:
perl -I /path/to/dependency/lib -c /path/to/file/to/check
Изменить: от человека perlrun
Каталоги, указанные как -I, добавляются к пути поиска для модулей (@INC).