
perl ::評論家 - 最佳實踐的評論perl源代碼。
use Perl::Critic;
my $file = shift;
my $critic = Perl::Critic->new();
my @violations = $critic->critique($file);
print @violations;
Perl ::評論家是一個可擴展的框架,用於創建和應用編碼標準到Perl源代碼。本質上,它是靜態源代碼分析引擎。 perl ::評論家與許多perl ::評論::試圖執行各種編碼準則的政策模塊分發。大多數政策模塊基於達米安·康威(Damian Conway)的書《珀爾(Perl)的最佳實踐》 。但是,Perl ::評論家不僅限於PBP,甚至會支持與Conway相矛盾的政策。您可以通過perl ::評論家界面啟用,禁用和自定義這些策略。您還可以創建適合自己口味的新政策模塊。
有關Perl ::評論家的命令行接口,請參閱Perlcritic的文檔。如果您想將Perl ::評論家與您的構建過程集成,請測試:: Perl ::評論家提供適合測試程序的界面。另外,Test :: Perl :: Critic ::漸進級對於逐漸將編碼標準應用於舊版代碼很有用。為了最終的方便(以某種靈活性為代價),請參閱Pragma的批評。
如果您想在不安裝任何內容的情況下嘗試Perl ::評論家,則可以在http://perlcritic.com上提供一個網絡服務。 Web服務尚未支持本機Perl :: Critic API中可用的所有配置功能,但它應該使您對其的作用有一個好了解。
同樣,ActivePerl包括一個非常光滑的圖形界面,稱為perlcritic-gui 。您可以從http://www.activestate.com獲得免費的社區版ActivePerl。
perl ::評論家在佩爾(Perl)上回到佩爾(Perl)5.10.1。它依靠PPI模塊來完成解析perl的繁重工作。
Perl::Critic模塊被認為是公共班級。其接口的任何更改都將通過折舊週期進行。
new( [ -profile => $FILE, -severity => $N, -theme => $string, -include => @PATTERNS, -exclude => @PATTERNS, -top => $N, -only => $B, -profile-strictness => $PROFILE_STRICTNESS_{WARN|FATAL|QUIET}, -force => $B, -verbose => $N ], -color => $B, -pager => $string, -allow-unsafe => $B, -criticism-fatal => $B)
new()
返回對新Perl ::評論家對象的引用。大多數參數只是直接傳遞到Perl :: Critic :: config,但我也在這裡描述了它們。所有參數的默認值可以在.perlcriticrc文件中定義。有關此信息的更多信息,請參見“配置”部分。所有論點都是可選的鍵值對,如下:
- profile是配置文件的途徑。如果未定義$FILE ,請perl :: Critis :: Config嘗試在當前目錄中查找.perlcriticrc配置文件,然後在主目錄中找到。另外,您可以將PERLCRITIC環境變量設置為指向另一個位置的文件。如果找不到配置文件,或者$FILE是一個空字符串,則所有策略都將加載其默認配置。有關更多信息,請參見“配置”。
- 嚴重程度是最低嚴重程度。只有大於$N嚴重程度的政策模塊才能應用。嚴重性值是整數範圍從1(最小違規)到5(最嚴重的違規行為)。默認值為5。對於給定的-profile較低的-severity ,通常會揭示更多違反政策的行為。您可以在.perlcriticrc文件中設置此選項的默認值。用戶可以重新定義其.perlcriticrc文件中任何策略的嚴重性級別。有關更多信息,請參見“配置”。
如果您很難記住嚴重性“ 5”是最限制的水平,那麼您可以使用以下命名值之一:
SEVERITY NAME ...is equivalent to... SEVERITY NUMBER
--------------------------------------------------------
-severity => 'gentle' -severity => 5
-severity => 'stern' -severity => 4
-severity => 'harsh' -severity => 3
-severity => 'cruel' -severity => 2
-severity => 'brutal' -severity => 1
名字反映了該守則被批評的嚴重程度: gentle批評只報告了最嚴重的違規行為,依此類推,直到brutal批評,甚至報告了最小的違規行為。
-是特殊表達,它決定了哪些政策基於其各自的主題應用。例如,以下將僅加載具有“錯誤”和“ PBP”主題的策略:
my $critic = Perl::Critic->new( -theme => 'bugs && pbp' );
除非明確給出-severity選項,否則設置-theme將-severity設置為1。您可以在.perlcriticrc文件中設置此選項的默認值。有關主題的更多信息,請參見“政策主題”部分。
- 包括對字符串@PATTERNS列表的引用。與所有其他設置無關,將始終加載至少一個m/$PATTERN/ixms策略模塊。例如:
my $critic = Perl::Critic->new(-include => ['layout'], -severity => 4);
這將導致Perl ::評論家應用所有CodeLayout::*策略模塊,即使它們的嚴重性級別小於4。您可以在.perlcriticrc文件中設置此選項的默認值。您也可以與-exclude選項結合使用-include 。請注意,當策略匹配這兩種模式時, -exclude優先於-include 。
-Exclude是對字符串@PATTERNS列表的引用。與所有其他設置無關,將不會加載至少一個m/$PATTERN/ixms策略模塊。例如:
my $critic = Perl::Critic->new(-exclude => ['strict'], -severity => 1);
這將導致Perl ::評論家不應用RequireUseStrict和ProhibitNoStrict策略”模塊,即使它們具有大於1的嚴重性級別。您可以在.perlcriticrc文件中為此選項設置默認值。您也可以與-include選項一起使用-exclude 。請注意,當策略匹配這兩種模式時, -exclude優先於-include 。
- 單調是弦PATTERN 。只能使用與m/$PATTERN/ixms匹配的策略。不匹配的政策將被排除在外。此選項優先於-severity , -theme , -include , -exclude和-only選項。您可以在.perlcriticrc文件中設置此選項的默認值。
-TOP是按其嚴重程度排名時要返回的最大違規數量。這必須是一個積極的整數。違規行為仍然按照文件內發生的順序返回。除非明確給出-severity選項,否則將-top默默設置為將-severity設置為1。您可以在.perlcriticrc文件中設置此選項的默認值。
- 僅是布爾值。如果設置為真值,Perl :: Criter只會從用戶個人資料中提到的策略中進行選擇。如果設置為假值(默認值),則Perl ::評論家從其網站上找到的所有策略中選擇。您可以在.perlcriticrc文件中設置此選項的默認值。
- profile-trictness是一個枚舉的價值,是perl :: critis :: critis :: utils :: utils :: constants(默認),“ $ profile_strictness_fatal”中的“ $ profile_strictness_warn”之一。如果設置為perl :: critis :: utils ::常數為“ $ profile_strictness_fatal”,則perl :: Critic將對在.perlcriticrc或通過-profile opare oparife fatal指定的文件中發現的問題發出某些警告。例如,Perl ::評論家通常只warn說涉及不存在的政策的個人資料,但這種價值使這種情況致命。相應地,perl :: Critic :: utils ::常數使Perl :: Critic閉嘴。
-force是一個布爾值,它控制著perl ::評論家是否觀察到您的代碼中的神奇的"## no critic"註釋。如果設置為真值,Perl ::評論家將分析所有代碼。如果設置為false值(默認值)perl ::評論家將忽略用這些註釋標記的代碼。有關更多信息,請參見“彎曲規則”。您可以在.perlcriticrc文件中設置此選項的默認值。
- 靜脈可以是正整數(從1到11),也可以是文字格式規範。參見Perl ::評論家::違反格式規格的解釋。您可以在.perlcriticrc文件中設置此選項的默認值。
-Unsafe指示Perl ::評論家允許使用作者標記為“不安全”的政策。此類政策可能會編譯不信任的代碼或做其他邪惡的事情。
-Perl ::評論家未使用- 顏色和- pager ,而是為了perlcritic的好處而提供。
- 批評者未使用批評戰術,而是出於批評的好處。
- 彩色 -彩色- 顏色 - 五個高, - 彩色- 五個介質, -color-coreverity-low和-color-colory-lowest- perl :: critist in Cittor in crialted of Perlcritic的好處。每個都設置為術語:: ansicolor顏色規範,以顯示違反相應嚴重性的違規行為。
- perl ::評論家未使用侵略性和- 罪行,而無侵略性則不使用,而是為了perlcritic的好處而提供,僅會顯示要顯示的相關文件名。
critique( $source_code )
使用已加載到該引擎中的所有策略的Perl :: Criver Engine運行$source_code 。如果$source_code是標量參考,則將其視為實際的perl代碼字符串。如果$source_code是對PPI ::文檔實例的引用,則該實例直接使用。否則,將其視為包含Perl代碼的本地文件的途徑。此方法返回perl :: Critic ::違反對象的違規對象的列表。該列表按順序排序,即違規行為出現在代碼中。如果沒有違規行為,此方法將返回一個空列表。
add_policy( -policy => $policy_name, -params => %param_hash )
創建一個策略對象並將其加載到該評論家中。如果無法實例化對象,它將拋出致命的例外。否則,它將返回對該評論家的參考。
-policy是Perl :: Critic ::政策子類模塊的名稱。 'Perl::Critic::Policy'部分可以為簡潔而省略。需要這個論點。
-Params是對策略參數哈希的可選參考。該哈希參考的內容將傳遞到策略模塊的構造函數中。有關其支持的參數的描述,請參見相關策略模塊中的文檔。
policies()
返回包含對已加載到該引擎的所有策略對象的引用的列表。對象將按其加載順序。
config()
返回perl :: Critic ::配置對象,該對像是為該評論家創建或給出的。
statistics()
返回為這個評論家創建的Perl ::評論::統計對象。統計對象累積了該評論家分析的所有文件的數據。
對於那些喜歡具有功能接口的人,可以根據請求導出critique方法並將其稱為靜態函數。如果第一個論點是hashref,則它的內容用於內部構建新的perl ::評論家對象。該哈希的鍵應與Perl::Critic::new()方法支持的密鑰相同。這裡有一些例子:
use Perl::Critic qw(critique);
# Use default parameters...
@violations = critique( $some_file );
# Use custom parameters...
@violations = critique( {-severity => 2}, $some_file );
# As a one-liner
%> perl -MPerl::Critic=critique -e 'print critique(shift)' some_file.pm
目前均未支持其他對象方法作為靜態功能。對不起。
Perl ::評論家和每個策略模塊的大多數設置都可以由配置文件控制。默認配置文件稱為.perlcriticrc 。 perl ::評論家將首先在當前目錄中查找此文件,然後在您的主目錄中查找此文件。另外,您可以設置PERLCRITIC環境變量,以明確指向另一個位置的另一個文件。如果這些文件都不存在,並且未給出-profile選項給構造函數,則將在Perl :: critis :: policy Namespace中找到的所有模塊都帶有其默認配置。
配置文件的格式是一系列INI風格的塊,其中包含由'='隔開的鍵值對。評論應以“#”開頭,如果需要的話,可以放在單獨的行或名稱值對之後。
Perl ::評論家本身的默認設置可以在第一個命名塊之前設置。例如,將這些或全部的任何或全部放在配置文件的頂部都會為相應的構造函數參數設置默認值。
severity = 3 #Integer or named level
only = 1 #Zero or One
force = 0 #Zero or One
verbose = 4 #Integer or format spec
top = 50 #A positive integer
theme = (pbp || security) && bugs #A theme expression
include = NamingConventions ClassHierarchies #Space-delimited list
exclude = Variables Modules::RequirePackage #Space-delimited list
criticism-fatal = 1 #Zero or One
color = 1 #Zero or One
allow-unsafe = 1 #Zero or One
pager = less #pager to pipe output to
配置文件的其餘部分是這樣的一系列塊:
[Perl::Critic::Policy::Category::PolicyName]
severity = 1
set_themes = foo bar
add_themes = baz
maximum_violations_per_document = 57
arg1 = value1
arg2 = value2
Perl::Critic::Policy::Category::PolicyName是實現策略的模塊的全名。根據Damian Conway的書Perl最佳實踐中的最佳實踐中的目錄,與Perl ::評論家分發的政策模塊已分為類別。對於簡潔起見,您可以省略模塊名稱的'Perl::Critic::Policy'部分。
severity是您希望分配給政策的重要性。所有政策模塊均定義為默認嚴重性值,範圍從1(最少)到5(最嚴重)。但是,您可能會不同意默認的嚴重性,並根據自己的編碼理念選擇更高或更低的嚴重性。您可以將severity設置為1到5的整數,也可以使用等效名稱之一:
SEVERITY NAME ...is equivalent to... SEVERITY NUMBER
----------------------------------------------------
gentle 5
stern 4
harsh 3
cruel 2
brutal 1
名字反映了該守則被批評的嚴重程度: gentle批評只報告了最嚴重的違規行為,依此類推,直到brutal批評,甚至報告了最小的違規行為。
set_themes為策略設置主題,並覆蓋其默認主題。該論點是一個或多個空格偏置的字母數字單詞的字符串。主題不敏感。有關更多信息,請參見“政策主題”。
add_themes將此策略的默認主題附加。該論點是一個或多個空格限制的單詞的字符串。主題是不敏感的。有關更多信息,請參見“政策主題”。
maximum_violations_per_document限制了策略將返回給定文檔的違規數量。某些政策具有默認限制;請參閱單個政策的文檔,以查看是否存在。要強制策略沒有限制,請為此參數的值指定“ no_limit”或空字符串。
其餘的鍵值對是配置參數,將傳遞到該策略的構造函數中。大多數策略對象的構造函數不支持參數,而確實應該有合理的默認值。有關更多詳細信息,請參見有關適當策略模塊的文檔。
您可以通過將A - “”預先為配置文件中的模塊名稱進行準備,而不是重新定義給定策略的嚴重性,而是可以完全禁用策略。無論如何提供給perl ::評論家構造者的 - -severity ,因此永遠不會加載該政策。
一種簡單的配置可能看起來像這樣:
#--------------------------------------------------------------
# I think these are really important, so always load them
[TestingAndDebugging::RequireUseStrict]
severity = 5
[TestingAndDebugging::RequireUseWarnings]
severity = 5
#--------------------------------------------------------------
# I think these are less important, so only load when asked
[Variables::ProhibitPackageVars]
severity = 2
[ControlStructures::ProhibitPostfixControls]
allow = if unless # My custom configuration
severity = cruel # Same as "severity = 2"
#--------------------------------------------------------------
# Give these policies a custom theme. I can activate just
# these policies by saying `perlcritic -theme larry`
[Modules::RequireFilenameMatchesPackage]
add_themes = larry
[TestingAndDebugging::RequireTestLabels]
add_themes = larry curly moe
#--------------------------------------------------------------
# I do not agree with these at all, so never load them
[-NamingConventions::Capitalization]
[-ValuesAndExpressions::ProhibitMagicNumbers]
#--------------------------------------------------------------
# For all other Policies, I accept the default severity,
# so no additional configuration is required for them.
有關其他配置示例,請參見此分佈的此examples目錄中包含的perlcriticrc文件。
達米安·康威(Damian Conway)自己的perl ::評論家的配置也包括在此分佈中作為examples/perlcriticrc-conway 。
Perl ::評論家分發了大量的政策模塊。在同伴文檔perl :: Critic :: PolicySummary和單個模塊本身中更詳細地描述了它們。說"perlcritic -doc PATTERN"以查看與正則態度m/PATTERN/ixms匹配的所有策略模塊的perldoc
CPAN上有許多其他策略分佈。如果Perl ::評論家不包含您想要的政策,那麼某些人可能已經寫了它。有關其中一些分佈的列表,請參見下面的“請參見”部分。
每個策略都用一個或多個“主題”定義。主題可用於創建任意策略組。他們旨在提供選擇您首選的一組政策的替代機制。例如,在分析測試程序時,您可能希望禁用一定部分的策略。相反,您可能希望在分析模塊時僅啟用特定的策略子集。
與Perl ::評論家一起發貨的政策已被打破以下主題。這只是我們提供一些基本邏輯分組的嘗試。您可以自由發明適合您需求的新主題。
THEME DESCRIPTION
--------------------------------------------------------------------------
core All policies that ship with Perl::Critic
pbp Policies that come directly from "Perl Best Practices"
bugs Policies that that prevent or reveal bugs
certrec Policies that CERT recommends
certrule Policies that CERT considers rules
maintenance Policies that affect the long-term health of the code
cosmetic Policies that only have a superficial effect
complexity Policies that specifically relate to code complexity
security Policies that relate to security issues
tests Policies that are specific to test programs
任何政策都可能符合多個主題。說"perlcritic -list"以獲取所有可用策略和與每個策略相關的主題的列表。您還可以更改.perlcriticrc文件中任何策略的主題。有關此信息的更多信息,請參見“配置”部分。
使用-theme選項,您可以創建一個任意複雜的規則,該規則確定將加載哪些策略。優先級與常規PERL代碼相同,您也可以使用括號來執行優先級。受支持的運營商是:
Operator Alternative Example
-----------------------------------------------------------------
&& and 'pbp && core'
|| or 'pbp || (bugs && security)'
! not 'pbp && ! (portability || complexity)'
主題名稱是不敏感的。如果將-theme設置為一個空字符串,則將其評估為所有策略。
perl ::評論家對您的代碼採取了硬線方法:您要么遵守或不遵守。在現實世界中,完全遵守編碼標準並不總是實用的(甚至可能)。在這種情況下,明智的做法是表明您有意違反標準,並且您對此有充分的理由(DGR)。
為了幫助這些情況,您可以通過使用註釋來指示Perl ::評論家忽略某些行或代碼塊:
require 'LegacyLibaray1.pl'; ## no critic
require 'LegacyLibrary2.pl'; ## no critic
for my $element (@list) {
## no critic
$foo = ""; #Violates 'ProhibitEmptyQuotes'
$barf = bar() if $foo; #Violates 'ProhibitPostfixControls'
#Some more evil code...
## use critic
#Some good code...
do_something($_);
}
"## no critic"註釋直接perl ::評論家忽略剩餘的代碼,直到找到"## use critic"註釋。如果"## no critic"註釋與代碼語句同一行,則只有該行被忽略了。要指導Perlcritic忽略"## no critic"註釋,請使用--force選項。
裸露的"## no critic"註釋可以禁用所有主動政策。如果您只想禁用特定的策略,請添加策略名稱作為參數的列表,就像您對"no strict"或"no warnings"布拉格馬斯一樣。例如,這將禁用ProhibitEmptyQuotes和ProhibitPostfixControls政策,直到塊結束或下一個"## use critic"註釋(以先到者為準):
## no critic (EmptyQuotes, PostfixControls)
# Now exempt from ValuesAndExpressions::ProhibitEmptyQuotes
$foo = "";
# Now exempt ControlStructures::ProhibitPostfixControls
$barf = bar() if $foo;
# Still subjected to ValuesAndExpression::RequireNumberSeparators
$long_int = 10000000000;
由於策略名稱與"## no critic"論點相匹配,因此您可以縮寫策略名稱或以這樣的鏡頭禁用整個政策家庭:
## no critic (NamingConventions)
# Now exempt from NamingConventions::Capitalization
my $camelHumpVar = 'foo';
# Now exempt from NamingConventions::Capitalization
sub camelHumpSub {}
該參數列表必須包含在括號或括號中,並且必須包含一個或多個逗號分隔的裸字(例如不要使用引號)。可以嵌套"## no critic"註釋,並且內部註釋命名的策略將被禁用,而那些已經禁用了外部註釋。
某些政策(例如Subroutines::ProhibitExcessComplexity適用於整個代碼。在這些情況下,必須出現"## no critic"註釋在報告違法行為的線上。例如:
sub complicated_function { ## no critic (ProhibitExcessComplexity)
# Your code here...
}
諸如Documentation::RequirePodSections類的策略適用於整個文檔,在這種情況下,違反了第1行。
明智地使用此功能。 "## no critic"註釋應在最小的範圍或單個代碼行中使用。而且,您應該始終對要禁用哪些政策盡可能具體(即永遠不會使用裸露的"## no critic" )。如果Perl ::評論家抱怨您的代碼,請在訴諸此功能之前嘗試找到合規的解決方案。
編碼標準是個人的,高度主觀的。 Perl ::評論家的目標是幫助您編寫符合一組最佳實踐的代碼。我們的主要目標不是決定這些做法是什麼,而是要實施他人發現的實踐。最終,您制定規則-Perl ::評論家只是鼓勵一致性的工具。如果您認為有一項重要的政策很重要,或者我們已經忽略了,我們將非常感謝貢獻,或者您可以簡單地將自己的私人政策加載到Perl ::評論家中。
Perl ::評論家的模塊化設計旨在促進新政策的添加。您需要對PPI有一定的了解,但是大多數策略模塊非常簡單,只需要大約20行代碼。請參閱此分佈中包含的Perl :: Critic ::開發人員文件,以逐步演示如何創建新的策略模塊。
如果您開發了任何新的政策模塊,請隨時將它們發送到<[email protected]> ,我很樂意考慮將它們放入Perl ::評論家發行。或者,如果您想直接從事Perl ::評論家項目,則可以通過https://github.com/perl-critic/perl-critic.git提供我們的存儲庫。
Perl ::評論家團隊也可以租用。如果您的組織具有自己的編碼標準,我們可以製定自定義政策來執行您的本地準則。或者,如果您的代碼基庫容易出現特定的缺陷模式,我們可以設計政策,以幫助您在生產之前捕獲這些昂貴的缺陷。要與perl ::評論家團隊討論您的需求,只需聯繫<[email protected]> 。
perl ::評論家需要以下模塊:
B ::關鍵字
config :: tiny
異常::班級
文件:: Spec
文件:: Spec :: Unix
文件::哪個
列表:: Someutils
列表:: util
模塊::可插的
perl ::整理
Pod :: spell
PPI
pod ::明文
POD :: SELECT
pod ::用法
可讀
標量:: util
字符串::格式
術語:: ansicolor
文字:: parsewords
版本
鼓勵您在https://groups.google.com/d/forum/perl-critic上訂閱公共郵件列表。開發團隊的至少一名成員通常會在IRC://irc.perl.org/#perlcritic中閒逛,您可以在Twitter上關注Perl ::評論家,網址為https://twitter.com/perlcritic。
有許多其他策略分佈。這裡列出了一些:
perl ::評論家::更多
perl ::評論家::劉海
perl ::評論家:: lax
perl ::評論家:: STRICTERSUBS
Perl ::評論家:: Swift
perl ::評論家:: TICS
這些分佈使您可以在單位測試中使用perl ::評論家:
測試:: Perl ::評論家
測試:: Perl ::評論家::進步
還有一個分佈將安裝所有Perl ::評論家相關的模塊:開發團隊已知的模塊:
任務:: Perl ::評論家
對人類的審查很難進行審查,更不用說機器了。如果您發現了任何錯誤,尤其是來自Perl :: Critic :: Policy的錯誤persions或False-Vistives,請在https://github.com/perl-critic/perl-critic/issues上提交它們。謝謝。
亞當·肯尼迪(Adam Kennedy) - 創造了PPI,Perl ::評論家的心靈和靈魂。
達米安·康威(Damian Conway) - 終於寫Perl最佳實踐:)
克里斯·多蘭(Chris Dolan) - 貢獻最佳功能和政策模塊。
安迪·萊斯特(Andy Lester) - 明智的聖人和全能測試的主人。
艾略特·尚克(Elliot Shank) - 自稱質量的怪胎。
朱塞佩·馬克西亞(Giuseppe Maxia) - 為了所有的偉大想法和積極的鼓勵。
和我的妻子沙龍(Sharon) - 忍受了我的全夜代碼會議。
還要感謝Perl Foundation提供的贈款,以支持Chris Dolan的項目,以實施二十個PBP政策。 http://www.perlfoundation.org/april_1_2007_new_grant_awards
Thanks also to this incomplete laundry list of folks who have contributed to Perl::Critic in some way: Gregory Oschwald, Mike O'Regan, Tom Hukins, Omer Gazit, Evan Zacks, Paul Howarth, Sawyer X, Christian Walde, Dave Rolsky, Jakub Wilk, Roy Ivy III, Oliver Trosien, Glenn Fowler, Matt Creenan, Alex Balhatchet, Sebastian Paaske Tørholm, Stuart A Johnston, Dan Book, Steven Humphrey, James Raspass, Nick Tonkin, Harrison Katz, Douglas Sims, Mark Fowler, Alan Berndt, Neil Bowers, Sergey Romanov, Gabor Szabo, Graham Knop, Mike Eldridge, David Steinbrunner, Kirk Kimmel,Guillaume Aubert,Dave Cross,Anirvan Chatterjee,Todd Rinaldo,Graham Ollis,Karen Etheridge,JonasBrømsø,Olaf Alders,Jim Keenan,SlavenRezić,SzymonNieznański。
jeffrey ryan thalhammer [email protected]
版權(C)2005-2018富有想像力的軟件系統。版權所有。
該程序是免費軟件;您可以將其重新分配和/或以與Perl本身相同的條款進行修改。可以在此模塊中包含的許可文件中找到此許可證的全文。