2011-10-31 93 views
8

如何對perl文件執行「淺」語法檢查。標準perl -c很有用,但它檢查導入的語法。當你在一個代碼倉庫中工作並推送到一個正在運行的環境,並且你有一個在倉庫中定義的函數但尚未推送到正在運行的環境時,這有時是很好但不是很好。它檢查函數失敗,因爲導入引用系統路徑(即使用Custom :: Project :: Lib qw(foo bar baz))。Perl淺層語法檢查?即。不檢查導入語法

回答

11

它實際上無法完成,因爲導入有能力影響後面代碼的解析。例如use strict使得它使得裸字不被解析爲字符串(和改變規則的名稱如何變量可以使用),use constant導致要定義的常數潛艇,和use Try::Tiny改變表達式涉及trycatch,或finally解析(通過給他們&原型)。更一般地說,任何將任何內容導出到調用者名稱空間的模塊都可能影響解析,因爲當名稱引用現有子例程時,perl解析器以不同方式解決歧義。

0

我想你可以在你的home文件夾中爲缺少的庫做存根。

8

有兩個問題:

  1. 如果所需的模塊缺少如何不會失敗-c

    解決辦法有兩個:

    A.添加一個假的/存根模塊生產

    B.在所有的模塊,使用特殊的包羅萬象的@INC子程序入口(使用潛艇在@INC是解釋爲here)。這顯然有一個問題,就是在實際的生產運行時,如果庫缺失 - 模塊沒有在我的書中出現DoublePlusNotGood失敗。

  2. 即使您可以以某種方式跳過對失蹤模塊的失敗,您仍然無法使用從缺失模塊導入的標識符或從該模塊的名稱空間顯式使用的標識符。

    對此的唯一現實的解決方案是回到#1a並使用虛假的存根模塊,但這次爲每個公共接口聲明和(根據需要)導出的標識符。例如。無所作爲的潛艇或虛擬變量。

    然而,即使這樣,也不能對一些先進的模塊動態確定如何在自己的命名空間創建和如何在運行時輸出(和呼叫者代碼可以動態地確定要調用哪個潛艇 - 赫克,有時哪些模塊導入)。

    但是,這種方法對於只能調用靜態命名的預定義公共子類,方法和訪問導出變量的普通「Java/C-like」OO或過程代碼來說工作得很好。

+0

感謝您的深入討論,我非常感謝 –

2

我會建議最好在你的語法檢查中包含你的代碼庫。 perl -I/path/to/working/code/repo/local_perl/ -c或設置PERL5LIB=/path/to/working/code/repo/local_perl/,然後運行perl -c。任一選項都應允許您檢查您的工作代碼,假設您的目錄結構與您的實時代碼類似。

0

你看過PPI了嗎?我認爲它確實遵循導入,但它可能更容易被修改以猜測看起來像一個函數名稱。