第1回

Text：情報技研

CPANを知り、CGI.pmを使ってみよう
CPAN（Comprehensive Perl Archive Network）
は、Perlプログラムとドキュメントの膨大なコレクシ
ョンである。プログラミングに便利な機能を寄せ集めたもので、さしずめ知恵の宝庫といえよう。
本連載では、CPANで4,000個以上提供されているPerlモジュールから便利なものを厳選し、その機能

http://www.cpan.org/を自分のPerlプログラムから使い、効率よくプログラミングする方法を解説する。

モジュールを集めたCPAN

そもそもPerlモジュールとはいろんなPerlプログラムを作っているうちに、自分がいつも使Perlモジュールについて少し解説しておこう。
「モジュール」とは、う機能は関数にしていつでも使えるようにする場合が多い。だれPerlにプログラム上便利な機能を追加するライブラリーで、プロもが使うような機能ならば、プログラミングの練習ならともかく、わグラミングを楽に行うための仕組みといえる。特定の機能をモジ

ざわざ自分でプログラミングするのは時間の無駄だ。

ュールという形式でインストールしておけば、プログラムから簡単

そこで、Perlプログラミングでよく使う機能や便利な機能を「モに呼び出してその機能を利用できる。一部のモジュールは標準でジュール」（詳しくは後述）にしてだれもが使えるようにすることで、インストールされているが、自分が使いたいモジュールはCPANな他人の労力や知恵を共有しようというのがCPANだ。

どから自由にインストールできる。

CPANのウェブページにアクセスすると、Comprehensive Perl

例をあげると、in-fileというファイルの中身をソートして、その結Archive Networkと大きく書かれている。これは、総合的なPerl果をout-fileというファイルに書き込むとしよう。これをPerlのプの蓄積を記録して保管するためのネットワークといった意味になログラムで書く場合、まずin-fileを開いてその内容を変数に読みるが、要するにみんなでPerlに関するいろいろな蓄積を共有する

込み、sort関数でソートしてから、out-fileを開き、ソートした変数ことを目的としたもので、Perlのモジュールだけでなくドキュメントの内容を書き込むのが普通だろう。

類などさまざまな情報がある。CPANも、もちろんオープンソースコミュニティーの精神で成り立っており、自由にCPANの蓄積を利用できるだけでなく、自らもCPANに貢献することもできる。
CPANからは、Perlのモジュール以外にも、便利なスクリプト、Perlの機能だけで作った場合

open(INPUT,'in-file');while(<INPUT>){
push (input,$_);

各種プラットフォームのバイナリー、ソースコードなどを入手でき}る。基本的なことはFAQにまとめられているので見ておくとよい。

close(INPUT);CPANサイトの「Browsing」の中にある「Perl modules」からモジュールのリストを見ると膨大な数があることがわかる。この中か@output = sort @input;
open(OUTPUT,'>out-file');forearch $i (@output){

ら自分の使いたいモジュールを探すことは大変だと思うかもしれprint OUTPUT $_;ないが、実際には検索サイトが用意されているのでそちらを利用}するとよいだろう。

close(OUTPUT);

http://search.cpan.org/

モジュール名で検索したり、カテゴリー別にモジュールを一覧しそれでは、CPANにある「File::Sort」というモジュールを使ったたりできる。このほか、CPANモジュールやPerlのドキュメントの場合に、このプログラムはどうなるだろうか。その例を次に示す。

検索はCPANサイトのトップページにあるSearchingの各ページ先ほど11行で作ったのと同じ処理が2行で済んでしまうのだ。

で検索できる。
CPANから入手できるモジュールのほとんどはGPLまたはPerl
図1

CPANサイト（http://www.cpan.org/） 本体と同じ条件で配布されているので、ほ160 +++ iNTERNET magazine 2003.03 +++File::Sortモジュールを使った場合

use File::Sort qw(sort_file);
sort_file('in-file','out-file');ぼ自由に利用できる

この場合、モジュールを呼び出したうえで、入力と出力のファイが、モジュールを使う

ルを指定してモジュールのメソッドを使うだけで、in-fileの各行を際には、必ず各モジソートした結果をout-fileに書き込んでくれる。

ュールに付属のドキ

このように、あたり前だが毎回書かなければいけない面倒なプュメントを参照してラ

ログラミングはモジュールを使えばどんどん省略できる。ここで示

イセンス条件などをしたのはほんの一例で、プログラミングを効率化してくれる便利確認してほしい。

なモジュールが数多く存在する。

インターネットマガジン／株式会社インプレスR&D©1994-2007 Impress R&D

CPAN利用を便利にするCPAN.pmモジュールを使ってみよう

CPANサイトにはかなりの数のモジュールがある。カテゴリー分
けされて整理されているとはいえ、特定のモジュールを探し、ダウンロード、解凍、インストールといった作業を手で行うのは面倒だ

モジュールをインストールしてみよう
次にCPANモジュールを使ってモジュールをインストールしよう。
まず、CPANモジュールをインタラクティブモードで起動する。

ろう。それを楽に行うために、CPAN.pmというPerlのモジュール# perl -MCPAN -e shellが用意されているので使ってみよう。

たとえばFTPモジュールであるNet::FTPモジュールをインスト

CPANモジュールは Andreas Konig氏の作で、Perl標準モジュールとなっているため、Perlがインストールされていればそのまールする場合には、CPANインタラクティブモードで次のように入力すればよい。

ま利用できる。CPANモジュールからはモジュールの各種検索、自cpan> install Net::FTP

動ダウンロードとインストールが行えるようになっており、これがあこれだけで、初期設定で指定したCPANサイトに自動的に接続れば簡単にPerlモジュールを追加できる。

して調べてくれる。指定したモジュールがシステムにインストールされている場合には、その旨表示される。システムにインストール

CPANモジュールの初期化されていない場合や、またはさらに新しいバージョンのモジュール

CPANを使ってモジュールを追加する前に、まずCPANモジュがみつかった場合には、ダウンロードからインストールまでを自動ールを初期化して、ダウンロードサイトを設定しておこう。CPANモ的に行ってくれる。インストールが終了するとプロンプトが表示さジュールを呼び出すには、perlコマンドが使える環境で次のようれるので、exitと入力して終了する。にコマンドを実行すればよい。

cpan> exit

これで Net::FTP モジュールがインストールできた。実際に# perl -MCPAN -e shell

これで、CPANモジュールがインタラクティブモードで起動する。
画面に各種質問事項が表示されるので、それに従って選択入力

CPANからモジュールを入手してみよう。次のページでは、まず手始めに、CGIプログラミングに便利なCGI.pmを紹介する。

をしていく
（図2）
。質問に答えていくと初期設定が完了してCPANモジュールのインタラクティブモードになるので、exitと入力してCPANのインストールは基本的にはPerlのインストールと同様にシス終了する。

テム管理者のrootで行った方がよい。root権限がなくてCPANを利用したい場合には、個人のホームディレクトリーの下にCPANをインスト

cpan> exitールすることになるので、利用者が限定されることに注意しておきたい。
図2

CPAN.pmの初期化の手順

まずメッセージが表示される（省略）
Are you ready for manual configuration? [yes]←[Enter]を入力
この後しばらく質問事項は[Enter]キーを押す
If you're accessing the net via proxies, you can specify
them in theCPAN configuration or via environment variables. The
variable in
the $CPAN::Config takes precedence.

(3) Indonesia(4) Israel(5) Japan（ほかにも国名の選択肢が表示されるが省略）
Select your country (or several nearby countries) [] 5
←国の選択なので日本（5）を選ぶ(1) ftp://ftp.ayamura.org/pub/CPAN/(2) ftp://ftp.cpan.jp/CPAN/（ほかにもダウンロードサイトの選択肢が表示されるが省略）
Select as many URLs as you like [] 2
← 自分の環境で高速につながるサイトを選ぶ
わからなければftp.cpan.jp/CPAN/を選ぶ

Your ftp_proxy? ← FTPのプロキシがある場合には入力
Your http_proxy? ← HTTPのプロキシがある場合には入力
Your no_proxy?

Enter another URL or RETURN to quit: []← [Enter]キーを押して続行する

You have no /root/.cpan/sources/MIRRORED.BY
I'm trying to fetch one

New set of picks:
ftp://ftp.cpan.jp/CPAN/

この後 MIRRORED.BY ファイルをダウンロードする
続けてしばらく質問事項は[Enter]キーを押す

WAIT support is available as a Plugin. You need theCPAN::WAIT module
to actually use it. But we need to know your favorite
WAIT server. If
you don't know a WAIT server near you, just press ENTER.

(1) Africa(2) Asia（ほかにも地域の選択肢が表示されるが省略）
Select your continent (or several nearby continents) [] 2
←地域の選択なのでアジア（2）を選ぶ(1) China(2) India

Your favorite WAIT server?
[wait://ls6.informatik.uni-dortmund.de:1404]← [Enter]キーを押す。メッセージが表示されて初期化が終了する
cpan>

インターネットマガジン／株式会社インプレスR&D©1994-2007 Impress R&D+++ iNTERNET magazine 2003.03 +++161

【カテゴリー】CGI【バージョン】2.89（2002/10/16）【作者】Lincoln D. Stein 氏【URL】
http://search.cpan.org/author/LDS/CGI.pm-2.89/CGI.pm
http://stein.cshl.org/WWW/software/CGI/

CGI.pm モジュール
HTMLによるCGIフォームを作り、データを受け取って処理するメソッドを多数持っている

CGI.pmモジュールは、CGIフォームの作成と受け取りを行うためのモジュールで、PerlでCGIプログラムを作成するうえで、だれもが行っているような操作を効率よくプログラミングする機能を提供している。Perlのバージョン 5.004以降では標準モジュールとなっているため、改めてインストールする必要はないが、最新版はもちろんCPANからダウンロードすることができる。原稿執筆時
点での最新バージョンは2.89で、2002年10月16日にリリースされたものである。

図3

フォームのデータを受け取って処理するコード#!/usr/bin/perl
foreach $i (split(/&/, $ENV{QUERY_STRING}){($key, $value) = split(/=/, $i);$key
=˜ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;$value =˜ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;$strings{$key} = $value;}
print "Content-type: text/html\n\n";print "<HTML><BODY>\n";print "<P>Your Name is $strings{name}.</P>\n";print "</BODY></HTML>\n";CGI.pmのココがスゴイ！
CGI.pmは、PerlでCGIプログラムを作成するときに使うようなら始め、それから目的とした処理（ここではパラメーター「name」の表示）を行っていた。ところがCGI.pmを使うことで、前処理の処理が簡単に行えるような機能を提供する。
ウェブページでよく使うフォームで送られたデータの処理なども、面倒なエンコード／デコードやタグ出力の処理を自分でいちいち書かなくても、CGI.pmを使えば簡単にできてしまうのだ。
また、CGIプログラミングにつきものの、HTMLタグを出力すことを考える必要もなく、ちょっとした宣言文の後に目的の処理を書くだけで同じことができてしまう。
また、このサンプルコードは GET メソッドを使う場合だが、POSTメソッドでは、環境変数$ENV{QUERY̲STRING}で読み込んでいるデータを標準入力より受け取るように書き換えなけれる機能もあり、CGIプログラミング全般に役に立つ。

ばならない。こういった細かいところもCGI.pmモジュールを使え

CGI.pmを使ったサンプル1：

ばプログラマーが気を使う必要はなくなる。

フォームデータの処理と出力
たとえば、フォーム処理を行うCGIのプログラムを作成する場

CGI.pmの代表的なメソッド

合、まずURLエンコードされた入力をデコードすることから始めな

CGI.pmにはたくさんのメソッドがあるが、サンプルプログラムでければならない。これを、CGI.pmのようなモジュールを使用しな利用したparam、header、start̲html、p、end̲htmlメソッドをそい場合には、一連の正規表現を使って変換したうえで変数に代入れぞれ簡単に説明しておこう。

するという処理を自分で書かなければならない。しかしこれだけでは、GETメソッドを使ってフォームから呼び出されたCGIが、各パラメーターを%stinrgという変数に格納しただけだ。実際に「name」

paramメソッド
パラメーター名の取得もしくは値の設定というパラメーターの値を表示したい場合には、次のように、おき【構文】

まりの「content-type」行を出力してから、値を出力する必要があparam([parameter,[value1,value2,...]]);

る（図3）
。

【引数】

さて、これをCGI.pmで行うとどうなるだろうか。説明はともかくコードを見てみよう。これだけで済んでしまうのである。

・parameter

取得するパラメーター名。省略の場合には既知のすべてのパラメーター名のリストを返す。

#!/usr/bin/perl
use CGI qw(:standard);

・value1, value2, ...

$name = param("name");新たにパラメーターに値を代入する場合に指定する。

print header;
print start_html;

Headerメソッド

print p("Your Name is $name")

HTTPヘッダーの生成

print end_html;【構文】

CGI.pmモジュールを使わない最初のサンプルコードの場合には、前処理としてURLエンコードされた入力をデコードすることか

162 +++ iNTERNET magazine 2003.03 +++header([content_type,status,headers]);【引数】

インターネットマガジン／株式会社インプレスR&D©1994-2007 Impress R&D

・content_type

図4

出力されるメディアタイプの指定。デフォルトは "text/html"。

CGI.pmのメソッドグループ■:html2グループ（HTML 2.xタグの生成）
a address b base blockquote body br charset cite code comment dd・status

出力されるHTTPのステータスコードおよび説明。デフォルトは"200 OK"。

dfn dl dt em end̲html escapeHTML h1..h6 head hr html i img input
kbd li Link menu meta nextid ol option p pre samp Select start̲html
strong title tt u ul var・headers

追 加したい ヘッダーの 指 定 。指 定 できるのは - t y p e = > 、nph=>、-status=>、-expires=>、-cookie=>、-target=>、header=>■:html3グループ（HTML 3.xタグの生成）
applet basefont big caption div embed font frame frameset ilayer
layer Param script small span strike style Sub sup table td th TR Tr■:html4グループ（HTML 4.xタグの生成）

start̲htmlメソッド

abbr acronym bdo col colgroup del fieldset iframe ins label legend
noframes noscript object optgroup Q tbody tfoot thead

パラメーター名の取得もしくは値の設定【構文】■:formグループ（フォーム要素の生成）

param([parameter,[value1,value2,...]]);

autoEscape button checkbox̲group checkbox defaults end̲form【引数】

end̲multipart̲form endform filefield hidden image̲button isindex

・parameter

MULTIPART

password̲field

scrolling̲liststart̲form

取得するパラメーター名。省略の場合には既知のすべてのパラメーター名のリストを返す。
・value1, value2, ...

popup̲menu

radio̲group

reset

startform

submitstart̲multipart̲form

textarea textfield tmpFileName uploadInfo URL̲ENCODED■:cgiグループ（CGIの処理）

新たにパラメーターに値を代入する場合に指定する。

Accept auth̲type cgi̲error content̲type cookie Delete̲all Delete
Dump header http import̲names param̲fetch param path̲info

Pメソッド
pタグの設定path̲translatedput

remote̲addr

remote̲hostquery̲string

request̲methodraw̲cookie

redirect

remote̲ident

restore̲parametersreferer

remote̲user
save̲parameters【構文】

script̲name self̲url server̲name server̲port server̲protocolp(parameter);server̲software upload url̲param url user̲agent user̲name【引数】

virtual̲hostparameter■:netscapeグループ（HTML 3.xに含まれてないネットスケープ拡張

pタグで表示する文字列タグの生成）
blink center fontsize

end̲htmlメソッド
HTML文書の終了【構文】

CGI.pmはオブジェクト指向モジュール

end_html;

CGI.pmはオブジェクト指向のモジュールとなっている。実際に使う分には特に怖がることもなければ、気にすることもなく利用できるが、その他のCGI.pmのメソッド
ここまでに出てきたCGI.pmのメソッドはほんの一部に過ぎな念のため説明をしておこう。
例であげた処理を正式に記述すると次のようになる。実際の処理でい。CGI.pm のメソッドには、CGI 処理に必要なもの、HTML やは「use」でモジュールを呼んだ後、コンストラクタ「new()」で$query

FORMのフォーマットのために必要なものなど数多くのものが存というCGIオブジェクトを生成し、$queryのメソッドを呼び出すことで在する。数多くのメソッドはグループ分けされて名前がつけられてパラメーターや各種の処理を行うことになる。

いる。各グループに含まれるメソッドを図4に示す。

実際のプログラミングでは記述の手間を減らすために、本文中のサ

また、:html2、:html3、:html4、 :netscapeをまとめた「:html」

ンプルプログラムのようなプログラミングを行ってしまえばよい。

や、:html2、 :html3、:html4、:cgi、:formをまとめた「:standard」

use CGI;と、全部まとめた「:all」というグループが存在する。実際に利用す$query = CGI::new();

る場合には「:standard」でほぼ問題ないだろう。使用するグルー$name = $query->param("name");プの宣言は最初の「use CGI qw(:standard)」の部分で行う。
このように、CGI.pmでは数多くのメソッドが用意されているの

print $query->header();
print $query->start_html();print $query->p("Your Name is $name")

で、CGIの基本的な処理やHTMLの出力といった自分で書くとめ

インターネットマガジン／株式会社インプレスR&D©1994-2007 Impress R&D+++ iNTERNET magazine 2003.03 +++163

んどうな処理を簡単に処理できてしまう。

図5

CGI.pmのHTMLタグ生成メソッドを使ったサンプルプログラム

これらのメソッドについては、CGI.pmの#!/usr/bin/perl

サイトで解説されている。

use CGI qw(:standard);

CGI.pmを使ったサンプル2：

printheader(-charset=>'euc-jp'),

HTMLタグの出力

start_html(-lang=>'japanese', -title=>'CGI.pmで作るHTML'

それでは、実際にCGI.pmモジュール-head=>meta({-http_equiv=>'Content-Type',-content=> 'text /html; charset=euc-jp'})),のメソッドを使ってみる。手軽に使えるも

h1('さまざまなHTMLタグの出力')のとしてはHTMLタグの生成メソッドがあcomment('ここから表スタート')

るので、これを使ってみよう。

table({-border=>1}, caption('月の名前')

CGIプログラムを書くときに面倒だとTr({-aglign=>CENTER},[th(['月','異名','英語']), td([1,'睦月',January]),

感じることの1つにHTMLの出力がある

td([2,'如月',February]), td([3,'弥生',March]),]だろう。いちいちテンプレートとなる),HTMLを先に書いておいたうえで、それ),をPerlのプログラムにprint文で埋め込hr,んでいくといった作業を行っていることもa({-href=>'http://www.google.com/', -target=>'_new'},'Googleの検索ページ'),多々あるだろう。なにより、Perlのコード

end_html;の中にHTMLのタグが混在すると、書きづらいうえに読みづらい。CGI.pmによるHTML タグの生成は、他のメソッドと比べて何かが非常に楽になるというあっと驚くものはないが、HTMLタグを生成す

図7

HTMLタグメソッドと出力の関係

図8

HTMLタグメソッドの使用例と出力の例

メソッド名('文字列')h1('さまざまなHTMLタグの出力')<HTMLタグ>文字列</HTMLタグ><H1>さまざまなHTMLタグの出力</H1>

るPerlコードを書きやすくするという点でcomment('ここから表スタート')は地味ではあるが便利なメソッドだといえる。
簡単なページを表示させるサンプルプ<!-- ここから表スタート -->図9オプションを特定するHTMLタグメソッドと出力の例

ログラムを図5に示す。このCGIを実行a({-href=>'http://www.google.com/', -target=>'_new'}, 'Googleの検索ページ

すると図6のようなページを出力する。

')

CGI.pmモジュールを使わないで同じような画面を表示させようとする場合、<A HREF="http://www.google.com/" TARGET="_new">Googleの検索ページ</A>

Perlコードの中にベタでHTMLを書いておくことになる。そうなると、HTMLタグとPerlコードが入り乱れて美しくないのは想像のつくとおりである。かといってコードを綺麗にするために、HTMLの部分だけを別ファイルにしておいて読み込むというのもそれはそれで面倒といえる。このサンプルプロ
図6

サンプルプログラムの実行結果

定した文字列をメソッドと同じ名前のタグで囲んで出力する。
たとえば、メソッドh1やcommentを例にとってみると、メソッドと出力されるHTMLの関係は図8のようになる。
これらのように単純なものでなくオプションを指定できるようなグ ラ ム を 見 ると 、タグの場合には、「{-オプション名=>'指定値'}」のようにしてオプシHTML のタグを出力

ョンとその値を指定する。たとえば、リンクを作るAタグであれば、するコードが Perl の図9のようになる。

コードに自然に組み込まれていて読みやすいことがわかるだ
ろう。

出力されるHTMLコードを見やすく
HTMLタグの生成メソッドを使うことでHTMLを生成するPerlのコードは見やすくなったが、実際に生成されるHTMLのコードがここで、HTML タ見やすいというわけではない。

グの生成メソッドについて説明しておく。基本的にメソッド名は実際にサンプルプログラムが生成するHTMLコードは、次ペーHTMLのタグ名と同じだと考えてよい。TABLEタグであればtable

ジの図10に示すような見づらいコードとなっている。ヘッダー部

メソッド、H1タグであればh1メソッドといった具合である。基本分はともかく、HTMLファイルのほとんどの内容が、改行されずに的な書式の対応は図7のようになると考えればよい。単純に、指1行にひたすら続いている。これでは生成したHTMLファイルを

164 +++ iNTERNET magazine 2003.03 +++インターネットマガジン／株式会社インプレスR&D©1994-2007 Impress R&D

図10

CGI.pmが出力した非常に見づらいHTMLコード<?xml version="1.0" encoding="utf-8"?><!DOCTYPE html
PUBLIC "-//W3C//DTD XHTML Basic 1.0//EN""http://www.w3.org/TR/xhtml-basic/xhtml-basic10.dtd"><html xmlns="http://www.w3.org/1999/xhtml" lang="japanese"><head><title> CGI.pmで作るHTML </title><meta content="text/html; charset=euc-jp" http-equiv="Content-Type" /></head><body><h1>さまざまなHTMLタグの出力</h1><!-- ここから表スタート --><table border="1"><caption>月の名前</caption> <traglign="CENTER"><th>月</th> <th>異名</th> <th>英語</th></tr> <tr aglign="CENTER"><td>1</td> <td>睦月</td><td>January</td></tr> <tr aglign="CENTER"><td>2</td> <td>如月</td> <td>February</td></tr> <traglign="CENTER"><td>3</td> <td>弥生</td> <td>March</td></tr></table><hr /><a href="http://www.google.com/"target="_new">Googleの検索ページ</a></body></html>

後から別の用途で加工して使おうとしても手間がかかる。
HTMLタグの生成メソッドを使わずに自分でインデントしながらHTMLコードを書くことで、出力するHTMLを見やすく

CGIモジュールにPrettyが付属していない場合はCPANモジュールを使ってPrettyをインストールしよう。
# perl -MCPAN -e shell

することはできるが、それは非常に手間がかかる。
CGI.pmモジュールには、便利なことに、出力するHTMLコ

cpan> install CGI::Prettyードを自動的にインデントするモジュールが存在する。このモジュールはCGIモジュール用のPrettyモジュールで、比較的最近のCGIモジュールがインストールされていれば標準で利用可能なモジュールである。
Prettyモジュールを使って自動的にインデントするには、先#!/usr/bin/perl
use CGI qw(:standard);←この行を付け足す。

これで、生成されるHTMLコードが自動的にタブでインデントされるようになる。また、次のようにすれば、インデントを明示的に指定することも可能である。
インデントをタブ2つに$CGI::Pretty::INDENT = "\t\t";インデントをスペース2つに$CGI::Pretty::INDENT = "";ここでは、空白 2 つでインデントするオプションをつけてHTMLコードを生成させてみよう。実際のPerlコードの頭の部分を次のように変更する。
#!/usr/local/bin/perl
use CGI qw(:standard);#次の2行を付け足す。
use CGI::Pretty;$CGI::Pretty::INDENT = "Prettyによって整形されたHTML

Content-Type: text/html; charset=euc-jp

ほどのPerlのサンプルコードに次の行を付け足すだけでよい。

use CGI::Pretty;

図11";

この結果生成されるHTMLコードの一部を図11に示す（長くなるので後半は省略）。非常に見やすくなっていることがわかるだろう。モジュールを利用すれば、Perlコードを数行追加するだけでここまでできてしまうのだ。
なお、使用しているPerlのバージョンが比較的古くて、標準の<?xml version="1.0" encoding="utf-8"?><!DOCTYPE html
PUBLIC "-//W3C//DTD XHTML Basic 1.0//EN""http://www.w3.org/TR/xhtml-basic/xhtmlbasic10.dtd"><html xmlns="http://www.w3.org/1999/xhtml"
lang="japanese"><head><title> CGI.pmで作るHTML</title><meta content="text/html; charset=euc-jp" httpequiv="Content-Type"></head><body><h1>
さまざまなHTMLタグの出力</h1><!-ここから表スタート--><table border="1"><caption>
月の名前</caption><tr aglign="CENTER"><th>
月</th><th>
異名</th><th>
英語</th></tr><tr aglign="CENTER"><td>
1</td><td>
睦月</td><td>
January</td></tr>

インターネットマガジン／株式会社インプレスR&D©1994-2007 Impress R&D+++ iNTERNET magazine 2003.03 +++165

［インターネットマガジン バックナンバーアーカイブ］ ご利用上の注意
この PDF ファイルは、株式会社インプレス R&D（株式会社インプレスから分割）が 1994 年～2006 年まで発行した月刊誌『インターネットマガジン』の誌面を PDF 化し、「インターネットマガジン バックナンバーアーカイブ」として以下のウェブサイト「All-in-One INTERNET magazine 2.0」で公開しているものです。

http://i.impressRD.jp/bn
このファイルをご利用いただくにあたり、下記の注意事項を必ずお読みください。
z 記載されている内容（技術解説、URL、団体・企業名、商品名、価格、プレゼント募集、アンケートなど）は発行当時のものです。
z 収録されている内容は著作権法上の保護を受けています。著作権はそれぞれの記事の著作者（執筆者、写真の撮影者、イラストの作成者、編集部など）が保持しています。
z 著作者から許諾が得られなかった著作物は収録されていない場合があります。
z このファイルやその内容を改変したり、商用を目的として再利用することはできません。あくまで個人や企業の非商用利用での閲覧、複製、送信に限られます。
z 収録されている内容を何らかの媒体に引用としてご利用する際は、出典として媒体名および月号、該当ページ番号、発行元（株式会社インプレス R&D）、コピーライトなどの情報をご明記ください。
z オリジナルの雑誌の発行時点では、株式会社インプレス R&D（当時は株式会社インプレス）と著作権者は内容が正確なものであるように最大限に努めましたが、すべての情報が完全に正確であることは保証できません。このファイルの内容に起因する直接的および間接的な損害に対して、一切の責任を負いません。お客様個人の責任においてご利用ください。

このファイルに関するお問い合わせ先
All-in-One INTERNET magazine 編集部
im-info@impress.co.jp
Copyright © 1994-2007 Impress R&D, an Impress Group company. All rights reserved.