2011-02-03 109 views
2

我對Perl很新,剛開始學習JavaScript時就開始使用它。我想知道是否有驗證器來檢查Perl代碼(如JS的Firebug)。如果有人知道一個可靠的一個它將不勝感激。我已經很多次Google搜索了很多次,並且我們都知道學習一門新的語言會犯錯。提前致謝!。有沒有人知道Perl驗證器

回答

6

here is an online perl validator

對於剛剛檢查,如果語法是乾淨的,你可以嘗試perl -c filename。爲了清理代碼格式,您可能需要查看PerlTidy。 。 您可能不需要vaidator。你可以自己做點什麼。

重定向錯誤信息

默認情況下,錯誤消息發送到STDERR。大多數HTTPD服務器將STDERR引導到服務器的錯誤日誌。某些應用程序可能希望保留與服務器的錯誤日誌不同的專用錯誤日誌,或者他們可能希望將錯誤消息指向STDOUT,以便瀏覽器接收它們。

carpout()函數是爲此目的而提供的。由於carpout()默認情況下不出口,你必須說

use CGI::Carp qw(carpout); 

的carpout明確導入()函數需要一個參數,它應該是一個開放的文件句柄的引用書寫錯誤。它應該在CGI應用程序頂部的BEGIN塊中調用,以便編譯器錯誤將被捕獲。例如:

BEGIN { 
    use CGI::Carp qw(carpout); 
    open(LOG, ">>/usr/local/cgi-logs/mycgi-log") or 
    die("Unable to open mycgi-log: $!\n"); 
    carpout(LOG); 
    } 

carpout()此時不會處理日誌中的文件鎖定。此外,請注意carpout()不適用於內存中的文件句柄,雖然補丁將被歡迎解決該問題。

真正的STDERR沒有關閉 - 它被移動到CGI :: Carp :: SAVEERR。有些服務器在處理CGI腳本時,在腳本關閉STDOUT和STDERR時關閉與瀏覽器的連接。 CGI :: Carp :: SAVEERR是爲了防止這種情況過早發生。

您可以通過各種方式將文件句柄傳遞給carpout()。 「正確」的方式可以通過對GLOB文件句柄的引用:

carpout(* LOG);

以下語法被接受,以及:

carpout(LOG); 
carpout(main::LOG); 
carpout(main'LOG); 
carpout(\LOG); 
carpout(\'main::LOG'); 
... and so on 

文件句柄和其他對象正常工作。

MAKING PERL錯誤出現在瀏覽器窗口中

如果你想將致命的(死了,坦白的)錯誤到瀏覽器,請導入特殊的「fatalsToBrowser」子程序:

use CGI::Carp qw(fatalsToBrowser); 
    die "Bad error here"; 

致命錯誤現在會回傳給瀏覽器以及日誌。 CGI :: Carp安排向瀏覽器發送一個最小HTTP頭,以便即使在早期編譯階段發生的錯誤也能看到。非致命錯誤仍將僅指向日誌文件(除非用carpout重定向)。

*注意fatalsToBrowser不mod_perl的版本2.0及更高版本。*

更改默認消息

默認情況下,軟件錯誤消息後跟一個說明聯繫網站管理員電子郵件與錯誤的時間和日期。如果此消息不符合您的喜好,可以使用set_message()例程更改。這不是默認導入的;您應該在use()行中導入它:

use CGI::Carp qw(fatalsToBrowser set_message); 
set_message("It's not a bug, it's a feature!"); 

您也可以傳入代碼引用以創建自定義錯誤消息。在運行時,您的代碼將與導致腳本死亡的錯誤消息的文本一起被調用。例如:

use CGI::Carp qw(fatalsToBrowser set_message); 
BEGIN { 
sub handle_errors { 
my $msg = shift; 
print "<h1>Oh gosh</h1>"; 
print "<p>Got an error: $msg</p>"; 
} 
set_message(\&handle_errors); 
} 
+0

我試過,但我使用的是Windows Vista。所以,當我對解釋器運行一個文件時,我必須編寫.. c:\ programs \ thefile.pl。其他命令不起作用。非常感謝。我會看看Perl整潔。 – 2011-02-03 19:23:33

+1

Vista下不應該有所不同。檢查perl bin目錄是否在PATH中。如果您在Windows下遇到Perl問題,可以在http://win32.perl.org和郵件列表上使用FAQ。 – 2011-02-03 20:13:23

+1

看到我編輯的答案。 – ayush 2011-02-03 20:18:50

6

由於perl是一種動態語言,因此有很多事情是無法驗證的;比如你可以調用一個在編譯時不存在的sub,因爲它可以在運行時創建。靜態驗證器無法知道該通話是否正確。

如果您只想知道代碼是否編譯,請使用perl解釋器本身。

如果您想檢查遵守給定編碼標準的代碼,請使用Perl::Critic

5

有很多方法可以解決這個問題。您可以閱讀http://perldoc.perl.org/perldebug.html以瞭解如何使用調試器,該調試器在某些方面與Firebug類似。但是還有很多其他方法可以自動避免問題。

  1. 如果您用 開始代碼,會自動捕獲許多常見錯誤類使用strict; 使用警告;

  2. http://perltidy.sourceforge.net/重新格式化您的代碼,並會使許多常見的錯誤容易發現。

  3. CPAN模塊Perl :: Critic執行自動代碼分析來執行特定的樣式決策。一致的風格使錯誤更容易追蹤。
  4. 使用單元測試。核心模塊Test :: More可以讓您輕鬆入門。
17

Perl本身呢?

perl -c your_program.pl 

如果您在程序的開頭添加以下內容,您將避免許多令人頭痛的問題。

use strict; 
use warnings; 
use diagnostics; 

最後,有Perl::Critic

相關問題