Подтвердить что ты не робот

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

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

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

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

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

4b9b3361

Ответ 1

Осторожно!!

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

$ perl -c yourperlprogram

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

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

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

perl -c ourprogram

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

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

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

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

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

и вы увидите проблему с этот аргумент. К сожалению.

Ответ 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).