53

我在我的 Bash 脚本中调用了许多 Perl 脚本(有时也来自 csh)。

在 Bash 脚本的开头,我想进行一个测试,检查所有 Perl 脚本是否没有任何编译错误。

这样做的一种方法是从 Bash 脚本中实际调用 Perl 脚本,并grep在管道日志文件中调用“编译错误”,但这会变得混乱,因为在代码中的不同点调用了不同的 Perl 脚本,所以我想在 Bash 脚本的最开始执行此操作。

有没有办法检查 Perl 脚本是否没有编译错误?

4

4 回答 4

75

谨防!!

使用以下命令检查 Perl 程序中的编译错误可能很危险。

$ perl -c yourperlprogram

Randal 写了一篇关于这个主题的非常好的文章,你应该看看

引用他的文章:

可能我们能说的最简单的事情是“它有效吗?”。为此,我们调用 perl 本身,传递只编译开关:

perl -c ourprogram

对于这个操作,perl 编译程序,但在执行阶段之前停止。这意味着程序文本的每一部分都被翻译成代表工作程序的内部数据结构,但我们实际上并没有执行任何代码。如果有任何语法错误,我们会收到通知,并且编译会中止。

其实,这有点骗人。多亏了 BEGIN 块(包括它们的分层表亲,use 指令),一些 Perl 代码可能已经在这个理论上安全的“语法检查”期间执行了。例如,如果您的代码包含:

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

然后您将看到该消息,即使在 perl -c 期间也是如此!对于那些认为“仅编译”意味着“不执行代码”的人来说,这有点令人惊讶。考虑包含以下内容的代码:

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

你会看到这个论点的问题。哎呀。

于 2012-10-16T06:06:08.457 回答
6

除了perl -c program.pl,最好使用以下命令查找警告:

perl -w program.pl

详情见:http ://www.perl.com/pub/2004/08/09/commandline.html

于 2013-11-18T11:32:07.660 回答
0

我将 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")
于 2018-03-17T19:42:51.487 回答
-1

当您需要在运行前检查错误/警告但您的文件取决于多个其他文件时,您可以添加选项-I

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

编辑:来自man perlrun

-I 指定的目录被添加到模块的搜索路径 (@INC)。

于 2017-04-10T09:01:19.920 回答