22 March 2011

(Perl) CGI.pmを用いてhtmlヘッダーを出力する

CPAN CGI.pm の headerメソッド、html_startメソッドを用いてhtml構文を開始する方法

■ 大まかなスケルトン

#!/usr/bin/perl use utf8; use CGI; my $q = new CGI; print $q->header(-type=>'text/html', -charset=>'utf-8'); print $q->start_html(-title=>"テストページ",-lang=>'ja-JP'); print "<p>Hello World</p>\n"; print $q->end_html;

出力されるHTMLは

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" lang="ja-JP" xml:lang="ja-JP"> <head> <title>テストページ</title> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> </head> <body> <p>Hello World</p> </body> </html>

■ HTML 4.01に対応したヘッダを作成するためには use CGI; に -no_xhtml プラグマを用いる。

#!/usr/bin/perl use utf8; use CGI qw/-no_xhtml/; my $q = new CGI; print $q->header(-type=>'text/html', -charset=>'utf-8'); print $q->start_html(-title=>"テストページ",-lang=>'ja-JP'); print "<p>Hello World</p>\n"; print $q->end_html;

出力されるHTMLは、DOCTYPEのDTDが変更され、<html>タグ内のxmlns属性が削除される。

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html lang="ja-JP"><head><title>テストページ</title> </head> <body> <p>Hello World</p> </body> </html>


■ DTDを強制的に指定する

XHTML1.0を想定して

#!/usr/bin/perl use utf8; use CGI; my $q = new CGI; print $q->header(-type=>'text/html', -charset=>'utf-8'); print $q->start_html(-title=>"テストページ", -dtd=>[ '-//W3C//DTD XHTML 1.0 Transitional//EN', 'http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd' ], -lang=>'ja-JP');

というように指定した場合は、出力は次のようになり、

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" lang="ja-JP" xml:lang="ja-JP">

HTML 4.01を想定して

#!/usr/bin/perl use utf8; use CGI; my $q = new CGI; print $q->header(-type=>'text/html', -charset=>'utf-8'); print $q->start_html(-title=>"テストページ", -dtd=>[ '-//W3C//DTD HTML 4.01 Transitional//EN', 'http://www.w3.org/TR/html4/loose.dtd' ], -lang=>'ja-JP');

と指定した場合は、(<html>タグ内のxmlns属性が削除されないまま)次のような出力になる。xmlns属性を除去するには、use CGI;で-no_xhtmlプラグマを使う必要がある。

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" lang="ja-JP" xml:lang="ja-JP">

■ <head>内に様々なタグを生成する

スタイルシート(CSSファイルへリンク及びインライン展開)、Java Script、refreshによる自動ジャンプ、検索ロボット回避タグ、著作権やキーワードなどの各種タグを生成するために、このようなスクリプトを記述する。

#!/usr/bin/perl use utf8; use CGI; my $q = new CGI; print $q->header(-type=>'text/html',-charset=>'utf-8'); print $q->start_html(-title=>"テストページ", -dtd=>[ '-//W3C//DTD XHTML 1.0 Transitional//EN', 'http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd' ], -lang=>'ja-JP', -script=>{-type=>'text/javascript',-src=>'script.js'}, -style=>[ {'src'=>'style.css'}, {'src'=>'style2.css'}, {'code'=>'h1{color:red;font-size:10pt;}'}], -xbase=>$q->url(-absolute=>1), -target=>'_new', -meta=>{ 'robots'=>'nofollow,noarchive', 'description'=>'CGIのテスト', 'keywords'=>'キーワード1,キーワード2', 'copyright'=>'copyright 2011 abcd efgh', 'author'=>'abcd efgh', 'generator'=>'perl 5', }, -head=>$q->meta({-http_equiv=>'refresh', -content=>'100; URL=test.cgi'}) );

このようなスクリプトは、つぎのようなHTMLを生成する

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" lang="ja-JP" xml:lang="ja-JP"> <head> <title>テストページ</title> <base href="/test-cgi.cgi" target="_blank" /> <meta name="keywords" content="キーワード1,キーワード2" /> <meta name="copyright" content="copyright 2011 abcd efgh" /> <meta name="author" content="abcd efgh" /> <meta name="robots" content="nofollow,noarchive" /> <meta name="description" content="CGIのテスト" /> <meta name="generator" content="perl 5" /> <meta http-equiv="refresh" content="100; URL=test.cgi" /> <link rel="stylesheet" type="text/css" href="style.css" /> <link rel="stylesheet" type="text/css" href="style2.css" /> <style type="text/css"> <!--/* <![CDATA[ */ h1{color:red;font-size:10pt;} /* ]]> */--> </style> <script src="script.js" type="text/javascript"></script> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> </head> <body>


■ ファイルをダウンロードさせる場合

print $q->header(-type=>'application/octet-stream', -attachment=>'test.txt');