Как проверить, нет ли ошибок компиляции в скрипте Perl?

Я вызываю много скриптов Perl в моем скрипте Bash (иногда из csh также).

в начале скрипта Bash я хочу поставить тест, который проверяет, все ли скрипты Perl лишены каких-либо ошибок компиляции.

один из способов сделать это-фактически вызвать скрипт Perl из сценария Bash и grep для "ошибки компиляции" в конвейерном файле журнала, но это становится грязным, поскольку разные скрипты Perl вызываются в разных точках кода, поэтому я хочу сделать это в самом начале скрипта Bash.

есть ли способ проверить, нет ли ошибки компиляции в скрипте Perl?

4 ответов


остерегайтесь!!

использование приведенной ниже команды для проверки ошибок компиляции в вашей программе Perl может быть опасным.

$ perl -c yourperlprogram

Рэндал написал очень хорошую статью на эту тему, которые вы должны проверить

цитата из его статьи:

вероятно, самое простое, что мы можем сказать: "это действительно?". Для этого, мы вызываем сам perl, передавая переключатель только для компиляции:

perl -c ourprogram

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

на самом деле, это немного ложь. Благодаря begin blocks (в том числе их многоуровневый кузен, директива use), некоторый код Perl может иметь был выполнен во время этой теоретически безопасной "проверки синтаксиса". Для пример, если ваш код содержит:

BEGIN { warn "Hello, world!\n" } 

тогда вы увидите, что сообщение, даже во время perl-c! Это несколько удивительно для людей, которые рассмотрим "компилировать только", чтобы означать "не выполняет код". Рассмотрим код, который содержит:

BEGIN { system "rm", "-rf", "/" } 

и вы увидите проблему с этот аргумент. Ой.


помимо perl -c program.pl, также лучше найти предупреждения с помощью команды:

perl -w program.pl

Подробнее см.:http://www.perl.com/pub/2004/08/09/commandline.html


Я использую следующие часть bash func для больших проектов 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")

когда вам нужно проверить ошибки/предупреждения перед запуском, но ваш файл зависит от mutliple других файлов, которые вы можете добавить опцию - I:

perl -I /path/to/dependency/lib -c /path/to/file/to/check

редактировать: от человек perlrun

каталоги, указанные-I, добавляются к пути поиска модулей (@INC).