在Perl中編碼時,代碼中的錯誤相當明顯——解析器會將所有錯誤信息都顯示在屏幕上,向你警告出現的問題,并讓你立即采取措施進行更正。如果你在開發HTML頁面,就不存在這樣的早期警告系統——標記中出現的任何錯誤都被瀏覽器所忽略。更糟糕的是,一些瀏覽器甚至試圖“自動”更正常見的標記錯誤,給這個過程帶來許多新問題。
最簡單的解決方案是在應用HTML之前對它進行檢測(或“驗證”)。這時就要用到一個稱為HTML::Lint的有用CPAN模塊。這個Perl模塊建立在人們所熟知的HTML::Parser模塊之上,旨在對標記進行檢驗,看其是否符合W3C標準,并指出可能使它“中斷”或在客戶瀏覽器中無法編譯的錯誤。
本文探討了HTML::Lint的一些功能,用它來檢驗HTML頁面并顯示發現的錯誤。首先,在Perl提示符下運行下列命令,下載并安裝此模塊(如果你還沒有這個模塊的話)。
perl> perl -MCPAN -e "install HTML::Lint"
Linting Files
安裝模塊后,建立并保存下面的HTML文件(保存為abc.html):
<html>
<head></head>
A is for apple, B is for baby
</body>
</html>
如你所見,此文件中有一個有意的錯誤——開頭缺少<body>標簽。這個錯誤在這里相當明顯;但如果文件更大更復雜的話,就更難發覺缺少這樣的標簽。這就是為什么下一步要編寫一些Perl代碼,用HTML::Lint來探測這個錯誤。
建立并保存下列的腳本(保存為linter.pl):
#!/usr/bin/perl
# initialize linter
use HTML::Lint;
$lint = HTML::Lint->new();
# parse file
$lint->parse_file("abc.html") or die("Cannot find file!");
# check for errors
($lint->err) ? print "Your code stinks!" : print "Your code rocks!";
這個過程相當簡單:這段腳本初始化一個HTML::Lint對象,然后應用對象的parse_file()方法來解析前面建立的HTML文件。檢測到的錯誤(如果存在的話)被存儲在@err數組中,并向控制臺顯示一個錯誤信息。
以下是你看到的輸出結果:
shell> ./linter.plYour code stinks!
當然,如果你有大量的文件要進行驗證的話,這段代碼就有點不切實際。在那種情況下,你可能想在運行時向腳本提交HTML文件名及路徑,而不是把它硬編碼到腳本中。列表A是前面腳本的修訂版,正好可完成這一工作。
列表A
#!/usr/bin/perl
# read file name from command line
if (!$ARGV[0]) { die ("ERROR: No file name provided"); }
# initialize linter
use HTML::Lint;
$lint = HTML::Lint->new();
# parse file
$lint->parse_file($ARGV[0]) or die("ERROR: Cannot find file");
# check for errors
($lint->err) ? print "Your code stinks! " : print "Your code rocks! ";
# print error count
print "Errors found: ", scalar($lint->err);
在這種情況下,腳本認為一個文件路徑是它的第一個引數,并將其保存在特殊的Perl @ARGV數組中。然后,腳本尋找這個文件,將它解析,并根據發現錯誤與否顯示一條信息。腳本的最后一行是新的:它根據HTML::Lint的@err錯誤數組的大小,顯示由解析器發現的錯誤數目。