Perl言語による簡単なCGIプログラムの作成方法を記述します。 |
| |
CGIプログラムの最初の1行目は「#!」に続いてPerlのパスを記述します。 コメントは「#」から始まり行末までです。 print文でHTMLを出力して表示します。文の末尾は「;」を付けます。 「\n」は改行です。但し、これはHTMLソースファイル上での改行です。表示上で改行する場合は<br>を使います。 最初に下記のHTTPヘッダーを出力します。ここでHTML言語テキストを指定します。 ヘッダーの区切りに空行が必要な為、\nを2個入れます。 print "Content-type: text/html\n\n"; print "・・・"で「"」を使用しているので「"」を出力する場合はその前に「\」を付けます。 exitでプログラムの実行を終了します。 上記はCGIプログラムで共通に必要な部分です。以下のプログラムではこの部分を省略して記述します。 | |
■プログラム (sample1.cgi)
| |
■実行結果
|
| |
スカラーは数値や文字列です。 ・スカラー変数($) 例:$data ← $(英字)(英字/数字/下線)、大/小文字を区別 ・シングルクォート文字列 '' 改行も文字と見なします。「'」「\」を表示するには直前に「\」を付けます。 例 print '太郎'; →太郎 print '太郎\n'; →太郎\n print '太郎\''; →太郎' print '太郎\\'; →太郎\ ・ダブルクォート文字列 "" 「\」の付いたメタ文字を使用できます。 $スカラー変数、@配列変数は値に置換されます(変数展開)。 「"」「\」「$」「@」を表示するには直前に「\」を付けます。 例 print "太郎"; →太郎 print "太郎\n"; →太郎 メタ文字 \n 改行 print "\Qab+*()[]\E"; →ab\+\*\(\)\[\] メタ文字 \Qから\Eまでの非英数文字の前に\を付ける print "太郎\""; →太郎" print "太郎\\"; →太郎\ $a=2; print "太郎$a"; →太郎2 print "太郎\$a"; →太郎$a print "太郎\@a"; →太郎@a ・演算例 $a += 5; $a = $a + 5;と同じ $a++; ++$a; 1を加算 $a--; --$a; 1を減算 $name = "山田" . "太郎"; →山田太郎(文字列の連結) int 整数に変換します。 例 $a = int($data); hex 16進数を表す文字列を10進数に変換します。 例 $a = hex("FF"); | |
■プログラム (sample10.cgi)
| |
■実行結果
|
| |
配列はスカラーをインデックス順に並べたものです。インデックスは0,1,2・・・の数値です。 配列要素の並びはリストで表示されます。 ・配列変数(@) 例:@data ← @(英字)(英字/数字/下線)、大/小文字を区別 ・配列要素 $data[0],$data[1] ・・・ ・(1 .. 5) は (1,2,3,4,5) と同じ ・(A .. E) は (A,B,C,D,E) と同じ ・@data = (4,6,8)とすると、 $x = @data; → $xは配列要素数3になる。 ($x) = @data; → $xは最初の要素4になる。 $x = $#data; → $xは最後のインデックス2になる。 push 配列の最後に要素を追加する。 例 push(@data,$x); unshift 配列の最初に要素を追加する。 例 unshift(@data,$x); reverse 配列の順番を反転する。 例 @data = reverse @data; sort 配列の要素を並べ替える。 例 @data = sort @data; 配列の要素をアスキーコード順に並べ替える。 @data = sort {$b <=> $a} @data; 配列の要素を数値の大きい順に並べ替える。 | |
■プログラム (sample11.cgi)
| |
■実行結果
|
| |
ハッシュはキーと値を対にした集合で、キーに文字列を使用できます。 ・ハッシュ変数(%) 例:%data ← %(英字)(英字/数字/下線)、大/小文字を区別 ・ハッシュ値 $data{'key1'},$data{'key2'} ・・・ keys ハッシュの全キーを取り出す。 例 @key = keys %data; values ハッシュの全ての値を取り出す。 例 @val = values %data; 下記はハッシュ値の数値の大きい順にキーを並べる場合の例です。 sort {$data{$b} <=> $data{$a}} keys(%data) | |
■プログラム (sample12.cgi)
| |
■実行結果
|
| |
条件分岐はif、unlessです。 条件は、<,>,<=,>=,==,!=,eq,neなどが使われます。 例: if ($a<5) { } elsif ($a==5) { } else { } if (!$a) { } ! は論理否定 if ($a eq '太郎') { } 文字列の場合は eq、ne if ($a ne '太郎') { } | |
■プログラム (sample13.cgi)
| |
■実行結果
|
| |
ループはwhile、until、for、foreachです。 例: while ($k<10) { } for ($k=0; $k<10; $k++) { } foreach $data (@data) {print $data;} foreach (@data) {print $_;} $dataを省略すると$_が使われます。 foreach (0 .. 9) {print $_;} ループを途中で抜けたい場合はlast、ループ処理を次へスキップしたい場合はnextを使用します。 | |
■プログラム (sample14.cgi)
| |
■実行結果
|
| |
正規表現は文字列パターンの記述方法でパターンマッチングに使われます。 正規表現は//で挟み、下記の記号が使われます。 | いずれかの文字列にマッチする。例:/太郎|次郎/ ^ 文字列の先頭にマッチする。 例:/^太郎/ $ 文字列の末尾にマッチする。 例:/太郎$/ . ドットは改行以外の任意の1文字にマッチする。 [ ] いずれか1文字にマッチする(文字クラス)。「-」は範囲を示す。 [a-zA-Z0-9_] → \wに略記 [ \r\t\n\f] → \sに略記 [0-9] → \dに略記(数字にマッチ) [^0-9] → \Dに略記(数字以外にマッチ) 直前の文字の頻出回数でマッチする。例:/.*/ /\d+/ * 0回以上 + 1回以上 ? 0回又は1回 下記の文字にマッチさせる場合はその直前に\を付けます。 ^ \ [ $ * + ? . { ( ) | 正規表現の使用例 if ($data =~ /太郎/) { } $dataに対して「太郎」とマッチするか判定する。 if (/太郎/) { } $dataを指定しない場合は$_が対象になる。 if (/ab/i) { } i修飾子は大文字と小文字を区別しない。 if (/(\d+)AB(\w+)/) {print $1,$2;} (\d+)が$1、(\w+)が$2に対応する。( )の順に$1,$2,・・・ s///ige 正規表現にマッチした部分を他の文字列に置換します。下記の修飾子があります。 i 大文字と小文字を区別しない。 g 全てのマッチを置換する。 e 置換文字列を式として実行する。 例 $data =~ s/a/0/; $dataにある最初のaを0に置換する。 s/a/0/ig; $_にある全てのa又はAを0に置換する。 s/(\d+):(\d+)/A=$1 B=$2/; 最初の(\d+)が$1、後の(\d+)が$2に対応する。 split 正規表現にマッチした部分で分割してリストにします。 例 ($a,$b) = split(/&/,$data); $dataを&で分割する。 @a = split(/&/); $_を&で分割して@aの配列に格納する。 @a = split(//); $_を1文字単位に分割して@aに格納する。 | |
■プログラム (sample15.cgi)
| |
■実行結果
|
| |
chop 文字列の最後の文字を削除します。引数を省略すると$_が対象になります。 例 chop($data); chop; length 文字の長さを示します。 例 $a = length($data); tr/// 文字を変換する。文字をリストで記述します。 例 $data =~ tr/A,C,E/a,c,e/; A,C,Eをa,c,eに変換する。 join 配列要素の間に文字列を挿入します。 例 $data = join('&',@a); @aの配列要素の間に&を挿入する。 index 文字列を左側から検索して最初に見つけた検索文字のバイト位置を示します。 バイト位置は先頭から0,1,2・・・で、見つからない場合は-1になります。 日本語は1文字当たり2バイトです。 例 $index = index($data,'C'); $dataから文字Cの位置を示す。 substr 指定したバイト位置から、指定したバイト長の文字を取り出します。 バイト位置は先頭から0,1,2・・・で、末尾からは-1,-2,-3・・・となります。 バイト長を省略すると最後まで取り出します。日本語は1文字当たり2バイトです。 substrを式の左辺に置くと取り出した文字の置換又は削除・追加ができます。 例 $word = substr($data,2,3); $dataのバイト位置2から3バイト分の文字を取り出す。 $word = substr($data,2); $dataのバイト位置2から最後までの文字を取り出す。 $word = substr($data,-5,3); $dataの末尾からのバイト位置5から3バイト分の文字を取り出す。 substr($data,2,3) = 'XY'; $dataのバイト位置2から3バイト分の文字をXYに置換する。 substr($data,2,3) = ''; $dataのバイト位置2から3バイト分の文字を削除する。 substr($data,2,0) = 'XY'; $dataのバイト位置2にXYを追加する。 sprintf 文字列や数値を指定の書式に変換します。主な書式変換記号を下記に示します。 %d 10進数、 %f 浮動小数点 例 $a = sprintf("%02d",$data); $dataを0詰め2文字にする。 $a = sprintf("%02d:%02d",$hour,$min); 例えば07:08のようになる。 $a = sprintf("%4.1f",$data); $dataを右詰め4文字幅、小数点以下1桁にする。 printf 文字列や数値を指定の書式に変換して出力します。書式変換はsprintfと同じです。 例 printf("%02d",$data); $dataを0詰め2文字で表示する。 | |
■プログラム (sample16.cgi)
| |
■実行結果
|
| |
一般的にWindowsやMacのパソコンでは日本語の文字コードにシフトJISが使われています。しかし、CGIプログラムをシフトJISで記述すると文字化けやエラーを起こす場合や正規表現が正常に実行されない場合があります。原因は、日本語が1文字2バイトのコードで表されますが、その2バイト目がPerlの特殊文字に重複したり正規表現にマッチしたりする為です。以下に問題点の内容と対策を示します。 文字化けの問題 日本語のシフトJISで2バイト目がPerlの特殊文字に重複すると文字化けが起きる場合があります。文字コードにEUCを使えば重複しないので文字化けは起こりません。 ◆ 2バイト目が\の文字 2バイト目がシフトJISで「5C」になる文字は「\」を表し、「\」はメタ文字に解釈される為、2バイト目は次の文字コードになります。従って、その該当文字及び次の文字が化けてしまいます。その為、特に文字列の最後に上記の文字を記述すると文法エラーを引き起こします。 例 "ソフト"→ャtト "表示"→侮ヲ (「ソ」「表」の2バイト目が\) 2バイト目が「\」になる主な文字を下記に示します。 ― ソ \ 表 予 能 申 十 構 貼 暴 欺 圭 噂 蚕 饅 箪 禄 兔 彌 対策を下記に示します。 ・上記の文字の直後に「\」を付けます。これによってメタ文字に解釈される「\」を補います。 例 "ソ\フト" "表\示" "予\定" ・シングルクォート文字列を使います。 例 'ソフト' '表示' '予定' 但し、文字列の最後に上記の文字を記述すると「\'」になる為、「'」が文字列に含まれてしまい文法エラーになります。 その場合は「\」を付けます。 例 '予定表\' ◆ 2バイト目が@の文字 2バイト目が「@」になる文字は、その次の文字に配列変数で使われる文字又は数字があると配列に解釈されて文字化けが起きます。 例 "方法A案"→方毎ト (「法」の2バイト目が@) 2バイト目が「@」になる主な文字を下記に示します。 ・全角スペース ・ァ 法 機 鼻 院 諭 繊 掘 察 宗 邸 如 后 魁 拭 叩 蓮 廖 対策はシングルクォート文字列を使います。 例 '方法A案' '方法',"$a案" 正規表現での問題 正規表現に日本語を使う場合は下記のような問題があります。 ◆ 2バイト目に正規表現で使う文字がある場合 日本語の2バイト目に正規表現で使う文字があると正しく実行されなかったり、文法エラーが起きたりします。特にフォーム入力のデータを正規表現に使う場合は、入力データによってエラーが起きたり起きなかったりするので注意が必要です。正規表現で使う文字 ^ \ $ * + ? . | [ ] { } ( ) 例 if ($data =~ /充分/) { } 文法エラーになります。「充」の2バイト目が [ であり ] がない為です。 $a='充'; if ($data =~ /$a/) { } この文を実行した時にエラーになります。 対策はメタ文字\Q\Eを使います。これは\Qから\Eまでの非英数文字の前に\を付けます。 例 if ($data =~ /\Q充分\E/) { } if ($data =~ /\Q$a\E/) { } ◆ 1バイトずれで誤ってマッチしてしまう場合 2バイト目又はそれ以降のバイトずれした文字は誤ってマッチしてしまう場合があります。 例 $data = '充分'; if ($data =~ /\Q[\E/) {print '一致';} 「充分」は [ にマッチしてしまいます 文字コードがEUCでもバイトずれによってマッチしてしまう場合があります。 対策は1文字毎のバイト長を認識させればいいですが複雑になるので割愛します。 正規表現で記述する文字長が大きければ誤ってマッチする可能性は低くなります。 | |
■プログラム (sample29.cgi)
| |
■実行結果
|
| |
サブルーチンはsubで定義します。呼び出しは&を付けます。引数は配列@_に自動的に格納されます。 myは変数名をサブルーチン内だけで有効にします。 例 &date(3,31); sub date { my($mon,$day) = @_; print "今日は$mon月$day日です。"; } サブルーチンの結果をreturn文で返すことができます。サブルーチンの実行はreturn文で終了します。 return文がない場合はサブルーチンの最後の式の値を返します。 例 $data = &add; sub add { $a = 1 + 2; return $a; } | |
■プログラム (sample4.cgi)
| |
■実行結果
|
| |
ファイルの入出力にはファイルハンドルを使います。 ファイルハンドルは入出力の対象となるファイルに付けた任意の名前で、Perl予約語と区別する為、英大文字にします。特別なファイルハンドルとして標準入力STDIN、標準出力STDOUTがあります。標準出力はブラウザになります。 open ファイルハンドルを作成し、指定したファイルに関連付けます。 出力の場合は > を付けます。追加書込みの場合は >> にします。 ファイルを新規に作成する場合はファイルハンドルを出力用にオープンします。 例 open IN,"data.txt"; open OUT,">data.txt"; open OUT,">>data.txt"; open(IN,"data.txt") or die; → オープンに失敗すれば、その時点でプログラムの実行を強制終了します。 open(IN,"data.txt") || &error("オープンできません"); → オープンに失敗すれば &errorサブルーチンを実行します。 close ファイルハンドルをクローズします。 例 close IN; close OUT; <xx> ファイルハンドルxxから行を読み込みます。 whileの条件式に使うと読み込んだ行が自動的に$_に格納され、ファイルの終わりまで繰り返します。 例 $data = <IN>; while (<IN>) {print $_;} read ファイルハンドルから、指定されたバイト長のデータを読み込みます。 例 read(STDIN,$in,$ENV{'CONTENT_LENGTH'}); print ファイルハンドルを指定してファイルに書き込みます。 ファイルハンドルを省略すると標準出力STDOUTになります。引数を省略すると$_になります。 例 print OUT $data; print $data; print; unlink ファイルを削除します。 例 unlink "data.txt"; rename ファイル名を変更します。 例 rename("data.txt","new.txt"); chmod パーミッションを変更します。 例 chmod(0666,"data.txt"); -e ファイル又はディレクトリが存在すれば真、存在しなければ偽になります。 例 if (-e "data.txt") { } | |
■プログラム (sample3.cgi)
| |
■実行結果
|
| |
ディレクトリの中にあるファイル名の読み出しにはディレクトリハンドルを使います。 ディレクトリハンドルは任意の名前で英大文字にします。 opendir ディレクトリハンドルを作成し、指定したディレクトリに関連付けます。 例 opendir DATA,"data"; opendir(DATA,"data") || &error("オープンできません"); → オープンに失敗すれば &errorサブルーチンを実行します。 closedir ディレクトリハンドルをクローズします。 例 closedir DATA; readdir ディレクトリの中にあるファイル名を読み出します。但し、カレントディレクトリ「.」と上位ディレクトリ「..」を含みます。 例 $file = readdir DATA; ファイル名を格納順に読み出します。 @file = readdir DATA; 全ファイル名を@fileに読み込みます。 mkdir ディレクトリを作成します。ディレクトリ名とパーミッションを指定します。 例 mkdir("data",0666); mkdir("data",0666) || &error("ディレクトリを作成できません"); rmdir ディレクトリを削除します。 例 rmdir("data"); rmdir("data") || &error("ディレクトリを削除できません"); | |
■プログラム (sample17.cgi)
| |
■実行結果
|
| |
複数の人が同時に同一のファイルに対して読み書きを行なうと正常に書き込まれない場合があります。そこで、ファイルロックにより1人がファイルにアクセスしている間は他の人がそのファイルにアクセスできないようにします。ファイルロックの方法として、ファイルロック関数flock、シンボリックリンク関数symlink、ディレクトリ作成関数mkdirを使用する方法があります。flock、symlinkはサーバによっては使用できない場合があるので、ここではmkdirによる方法を記述します。 この方法はディレクトリの有無がファイルアクセスの有無を表します。mkdirがディレクトリの存在チェックと生成を同時に行えることを利用しています。処理の流れを下記に示します。 1.ファイルアクセスの前にmkdirを実行します。 2.mkdirはディレクトリが存在しなければディレクトリを生成し「真」を返します。 既にディレクトリが存在すると「偽」を返します。 3.「真」の場合はファイルアクセスを行います。 4.「偽」の場合はウェイト後リトライします。 指定回数リトライしても「偽」の場合はタイムアウトで終了します。 5.ファイルアクセスが終了したらディレクトリを削除します。 sleep 指定した秒数スリープする。 例 sleep(2); | |
■プログラム (sample26.cgi)
| |
■実行結果
|
| |||||||||||||||||||||||||||||||||||||||||||||
環境変数はサーバからCGIプログラムへのデータ受け渡しに使われます。 これはサーバによって自動的にハッシュ%ENVに格納され、読み出しは$ENV{'CONTENT_LENGTH'}のように行います。フォームからのデータ入力やクッキーの受け渡しなどができます。主な内容を下表に示します。
下記のプログラムは環境変数の一覧を表示します。 | |||||||||||||||||||||||||||||||||||||||||||||
■プログラム (sample20.cgi)
| |||||||||||||||||||||||||||||||||||||||||||||
■実行結果
|
| |
IPアドレスは環境変数$ENV{'REMOTE_ADDR'}で取得できます。しかし、ホスト名はDNSサーバ問合せの負荷がかかる為、環境変数$ENV{'REMOTE_HOST'}では取得できない場合が多いようです。 そこで、IPアドレスからホスト名を取得するにはgethostbyaddrを使います。 gethostbyaddr IPアドレスに対応するホスト名を取得します。 例 $host = gethostbyaddr(pack('C4',split(/\./,$addr)),2); pack'C4':char値4個の引数によるバイナリデータ $addr: IPアドレス 2 : インタ−ネットIPプロトコル(IPv4)の指定 | |
■プログラム (sample27.cgi)
| |
■実行結果
|
| |
■HTTPヘッダー HPを表示する際、サーバからブラウザへHTTPヘッダーが送信されます。 CGIが出力する主なヘッダーを下記に示します。 Content-type: text/html HTML文書(参照「基本」) Content-type: image/gif GIF画像(参照「画像出力」) Content-type: image/jpeg JPEG画像 Set-Cookie: name=data; expires=wdy, DD-Mon-YYYY HH:MM:SS GMT クッキー保存(参照「クッキーの使い方」) Location: url urlページのリロード ■METAタグ HTMLのMETAタグでHTTPヘッダーを補完することができます。 METAタグは<head>と</head>の間に記述します。(注)<>は半角で記述します。 <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=Shift_JIS"> シフトJIS文字コードを指定 <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=EUC-JP"> EUC文字コードを指定 <META HTTP-EQUIV="Set-Cookie" CONTENT="name=data; expires=wdy, DD-Mon-YYYY HH:MM:SS GMT"> <META HTTP-EQUIV="Refresh" CONTENT="t; URL=url"> t秒後にurlページをリロード |
| |
フォームからデータを入力して表示します。受け渡しの情報は環境変数%ENVに自動的に格納されます。 フォームからの入力方法にはGETとPOSTがあり下記の特徴があります。 GETかPOSTかは入力のformタグのmethodで指定し、環境変数REQUEST_METHODに格納されます。 methodを指定しない場合はGETになります。 GET ・フォーム入力データは送り先のURLの後に?を付けて渡される。 xxx.cgi?xx=xx&xx=xx・・・ ・フォームだけではなくリンクタグでデータを簡単に渡すことができる。 ・入力データは環境変数QUERY_STRINGに格納される。 ・環境変数に格納できるデータ長が限定される。 ・入力データがURLで表示されるので内容が分かってしまう。 POST ・入力データは標準入力STDINに格納される。 ・データ長が環境変数CONTENT_LENGTHに格納される。 ・大量のデータを送ることができる。 ・入力データはURLに表示されない。 フォームから入力されたデータは下記のようにURLエンコードされます。 その為、入力データを表示するにはデコードして元に戻す必要があります。 ・「名前=値」で一対にします。 ・複数の対は&で区切ります。(名前=値&名前=値) ・空白は「+」に変換します。 ・日本語文字コードは%に続いて16進数2桁で表します。(英数字はそのまま表します) read(STDIN,$in,$ENV{'CONTENT_LENGTH'}); 標準入力STDINからデータを読み取る。 ($name,$data) = split(/=/,$in); 入力されたデータ「word=データ」をsplitで分離する。 $data =~ tr/+/ /; trで「+」を空白に変換する。 $data =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; 文字コードを日本語に変換する。 | |
■プログラム (sample2.cgi)
| |
■実行結果
|
| |
いろいろなフォーム形式から複数のデータを入力します。 @pair = split(/&/,$in); 複数のデータ対を&で分離して@pairに格納します。 $in{$n} = $val; データの名前$nをキーにしてデータ値$valをハッシュ%inに格納します。 | |
■プログラム (sample18.cgi)
| |
■実行結果
|
| |
cgi-lib.pl はフォーム入力データのデコードなどを処理するライブラリです。 &ReadParse; cgi-lib.plでデコード処理を行うサブルーチンです。 フォーム入力データの名前をnameとするとデータは$in{'name'}に格納されます。 複数選択できる「チェックボックス」の場合は各値が「\0」で区切られて格納されます。 require ライブラリを読み込みます。 例 require './cgi-lib.pl'; | |
■プログラム (sample23.cgi)
| |
■実行結果
|
| |
乱数を発生させるにはrandを使います。 rand 0から引数の範囲で乱数を発生します。乱数は小数点以下を含みます。 引数を省略すると0〜1の範囲になります。 例 $data = rand(10); $data = int(rand(5)); srand randで生成する乱数の種をセットします。但し、最近のPerlでは不要のようです。 例 srand; | |
■プログラム (sample22.cgi)
| |
■実行結果
|
| |
パスワードなどの文字列を暗号化するにはcryptを使います。 crypt 暗号化の種を使って文字列を暗号化します。種は任意の英数字2文字を指定します。 暗号化された文字列の先頭2文字は種になります。尚、復号化はできません。 例 $pass = crypt('1234','ab'); ←パスワード1234を種abで暗号化する。 パスワードの照合は、入力されたパスワードを同じ種で暗号化して照合します。 下記で、cryptは$passの先頭2文字を自動的に読み取ります。 if (crypt($inpass,$pass) eq $pass) { } | |
■プログラム (sample21.cgi)
| |
■実行結果
|
| |||||||
グラフを表示します。グラフの長さは画像の表示幅で指定します。 @data = (98,78,52); データを配列に用意します。 $w = int($_ * 3); グラフの長さを調整します。 | |||||||
■プログラム (sample5.cgi)
| |||||||
■実行結果
|
| |
日時を表示します。 time 1970年1月1日から現在までの秒数を表します。 例 $nowtime = time; localtime time形式の時間をローカル時間に変換します。 例 ($sec,$min,$hour,$mday,$mon,$year,$wday) = localtime($time); $time:time形式の時間。省略した場合はtimeになります。 $sec:秒 $min:分 $hour:時 $mday:日 $mon:月(0〜11で1〜12月を表す) $year:年(1900年を基準にして経過した年を表す) $wday:曜日(0〜6で日〜土を表す) ローカル時間は下記にて設定できます。localtimeを使用する前に設定します。 $ENV{'TZ'} = "JST-9"; ←日本の場合、時差9時間 gmtime time形式の時間をグリニッジ標準時間に変換します。変換形式はlocaltimeと同様です。 | |
■プログラム (sample6.cgi)
| |
■実行結果
|
| |
クッキーはデータをブラウザ側に保存して読み出す機能です。 例えば、掲示板で一度入力したデータを自動的に表示する場合などに使われます。 <クッキーの保存> クッキーはデータ書き込み時に保存します。 クッキーをブラウザ側へ保存するには、下記のSet-Cookieというヘッダー情報を記述します。 この情報はヘッダーの区切りを示す空行の前に出力しなければなりません。 Set-Cookie: name=data; expires=date; name データを区別する為に任意の名前を付けます。 data 保存するデータ date クッキーの有効期限を下記のように記述します。 wday, mday-mon-year hour:min:sec GMT (例) Sun, 02-Apr-2003 12:00:00 GMT wday:曜日 Sun,Mon,Tue,Wed,Thu,Fri,Sat mday:日 01〜31 mon :月 Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec year :西暦年 hour:時 00〜23 min :分 00〜59 sec :秒 00〜59 GMTはグリニッジ標準時間を表します。 <クッキーの読み出し> クッキーは複数のCGIからのデータが環境変数HTTP_COOKIEに自動的にセットされます。 複数のクッキーはHTTP_COOKIEに下記のように「; 」で区切られてセットされます。 name=data; name=data; ・・・ CGIでその環境変数を読み出し、クッキーを保存した時の名前のデータを取り出します。 但し、データ書き込み時はその書き込みデータをクッキーとする必要があります。 これは、環境変数はCGIを実行する前にセットされている為です。 | |
■プログラム (sample19.cgi)
| |
■実行結果
|
| |
年月日を指定して曜日を求めるプログラムです。 ツェラーの公式を使って西暦年月日から曜日を算出します。 この公式は、1月と2月を前年の13月、14月として計算します。算出結果は 0〜6で、日〜土を表します。 | |
■プログラム (sample7.cgi)
| |
■実行結果
|
| ||||||||||||||||||||||||||||||||||||||||||||||||||
年月を指定してカレンダーを作成します。 &calendar(2003,3); サブルーチンを呼び出します。引数は年月です。 @mdays は1〜12月の各日数です。 if ($mon == 2 && $year % 4 == 0) {$mdays = 29;} うるう年を判定します。 &date($year,$mon,1); 指定された年月の1日の曜日を算出します。 $wは曜日、$kは日付を表します。 | ||||||||||||||||||||||||||||||||||||||||||||||||||
■プログラム (sample8.cgi)
| ||||||||||||||||||||||||||||||||||||||||||||||||||
■実行結果
|
| |
CGIがGIF画像を直接出力して表示します。 HPからは下記のようにIMGタグでCGIを起動できます。 <IMG SRC="sample24.cgi"> HTTPヘッダーは下記のようにGIFを指定します。 print "Content-type: image/gif\n\n"; binmode ファイルハンドルに対してバイナリモードを指定します。 例 binmode IMG; binmode STDOUT; 標準出力をバイナリモードにします。標準出力はブラウザになります。 | |
■プログラム (sample24.cgi)
| |
■実行結果
|
| |
GIF画像を連結するにはgifcat.pl を使います。これは、杜甫々氏によるフリーソフトライブラリです。 同じ大きさの複数の画像を横方向に並べます。カウンタの表示に利用すると便利です。 例 require 'gifcat.pl'; binmode(STDOUT); print &gifcat'gifcat("1.gif","2.gif","3.gif"); | |
■プログラム (sample28.cgi)
| |
■実行結果
|
| |
JPG画像をアップロードします。画像入力にcgi-lib.plライブラリを利用します。 formタグで enctype="multipart/form-data"を指定します。 画像入力のinputタグで type=file を指定します。 $in{'img'} 画像の入力データです。&ReadParseによってデータがセットされます。 &img("pic"); 画像ファイル名をpicとしてimgサブルーチンを呼び出します。 if ($in[0] =~ /Content-Type: image\/.*jpeg/i) { JPG画像の判定です。&ReadParseによって@inにフォーム入力の情報がセットされます。 | |
■プログラム (sample9.cgi)
| |
■実行結果
|
HOME | Copyright (C) CGI-design All Rights Reserved. |