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');