簡體   English   中英

如何檢查Perl腳本是否沒有任何編譯錯誤?

[英]How to check if a Perl script doesn't have any compilation errors?

我在我的Bash腳本中調用了許多Perl腳本(有時也來自csh)。

在Bash腳本的開頭我想要一個測試,它檢查所有Perl腳本是否沒有任何編譯錯誤。

實現此目的的一種方法是實際從Bash腳本調用Perl腳本並在管道日志文件中grep “編譯錯誤”,但這會變得混亂,因為在代碼中的不同點調用不同的Perl腳本,所以我想要在Bash腳本的最開始執行此操作。

有沒有辦法檢查Perl腳本是否沒有編譯錯誤?

謹防!!

使用以下命令檢查Perl程序中的編譯錯誤可能很危險。

$ perl -c yourperlprogram

蘭德爾寫了一篇關於這個主題的非常好的文章,你應該看一下

引用他的文章:

可能我們能說的最簡單的事情是“它有效嗎?”。 為此,我們調用perl本身,傳遞僅編譯開關:

 perl -c ourprogram 

對於此操作,perl編譯程序,但在執行階段之前停止。 這意味着程序文本的每個部分都被轉換為代表工作程序的內部數據結構,但我們實際上並沒有執行任何代碼。 如果有任何語法錯誤,我們會收到通知,編譯將中止。

實際上,這有點謊言。 由於BEGIN塊(包括它們的分層表兄,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函數的以下部分來處理更大的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

編輯 :來自man perlrun

由-I指定的目錄前置於模塊的搜索路徑(@INC)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM