CGIの改造

ここではCGIを改造する時の注意について説明をします。

CGIを改造する上での前提

 まずCGIを改造する場合はあくまで自己責任でと言うことです。改造CGIにつきましてはその作者も一般にはサポートしてくれません。(一部例外はありますが。)
 ただ他の章で述べていますように一般にCGIの改造は作者が「ここまで」と書いてある部分以降を書き換えることを示しますが、実際に背景がカラーでの指定しか出来ないところを壁紙で指定したり、また左寄りのレイアウトをセンター寄せで表示させたりする程度のことは大した改造とは考えられませんし、臨機応変に対応が必要だと考えます。

 またもう一つ前提となるのはHTMLを知らなければ改造には手を付けるべきではないと言うことです。
 CGIとはプログラムでデータを処理し、それをHTMLで出力しますからHTMLを理解していなければ改造は不可能だと言うことです。
 CGIについては細かな観察と配慮でperlを完全に理解していなくても他の行や他のプログラムなどを参照することによってある程度の改造は可能です。

基本的な記述

 CGIをよく見れば分かりますようにCGIの表示部分の記述は基本的に以下のようになっています。

 print "***************\n";

 そして****の部分は普通のHTMLで書かれています。それを見本にして自分なりにタグを足したり書き換えたりすることによって自分の好みのスタイルで表示させることが出来ます。その場合の注意としては "*****" のように " ' で囲まれる部分は必ず\"*****\" とか \'*****\' のように\を入れておく必要があります。
 ただサイズ指定やカラー指定などの場合別に " でくくらず color=#ff0000 でもいい場合の方が多いようです。
 また各行の最後の ; にも注意が必要です。簡単な改造を行ってCGIが働かなくなる原因の殆どは "' ; の入れ忘れとか表示タグ内での\の付け忘れが多いようです。

 またややこしいCSSHTMLなどを書き足す場合次の方法もあります。

 print <<"EOM";

  普通のCSSHTMLのタグ

 EOM

 この場合は " の処理などに気を使わず普通に記述することが出来ます。

CGIの基本的な流れ

 CGIをよく見れば分かりますようにCGIのプログラムの中はいくつかのプロックに分かれています。
 初期設定部分、最初に時間やデータなどを受け取る部分、ヘッダの表示部分、フッターの表示部分、データの表示部分、データの処理部分、エラーの表示部分などいくつかの部分に分かれています。
 そしてそれぞれの部分の最後には殆どの場合exit; と書かれています。また何らかの処理を行う場合は &**** とあって、他の部分の sub **** という部分がその作業を行います。
 それを前提にCGIプログラム全体を見回しますと大体の全体像が理解できると思います。またそれを把握することが改造の基本となります。

文字化けへの対応

 CGIはどうしても文字化けから逃れることは出来ません。文字化けする特有の文字以外にも数多くの理由が考えられます。
 それらの症状とそれぞれへの対処をいくつか述べてみます。

 まず画面全体が文字化けしてしまって「エンコード」→「自動判断」できちんと表示される。

   この場合はヘッダに文字コードが設定されていない場合に起こります。そういう場合はヘッダ部分に以下の記述を足します。
   <META HTTP-EQUIV="Content-type" CONTENT="text/html; charset=Shift_JIS">
   当然その書き込まれる部分によってprint " \n"; \の挿入が必要です。

 いつも同じ部分だけ文字化けして、ソースを見るとそこだけシフトJISではなくEUCになっている。

   これはデータの引き渡しの過程でプログラム内で文字コードがEUCに変わってしまっている場合に起こります。
   そんな場合は例えばそのデータを $name だとしますと、それを表示する部分に
   &jcode'convert(*name,'sjis');
   と書き加えてシフトJISに変換してから $name を表示させれば文字化けから回避できます。

 sendmailでメールを送った場合文字化けする。

   メールの場合はシフトJISではなくてJISコードでやりとりされます。
   メールの「エンコード」→「自動判別」で文字化けが解消する場合はメールのヘッダに
   Content-Type: text/plain; charset=iso-2022-jp
   と書き込んで文字コードを設定しておけば文字化けしません。
   また部分的に化ける場合は文字コード変換がきちんと出来ていない場合で
   &jcode'convert(*name,'jis');
   のように書き込んであらかじめJISコードに直しておく必要があります。

データの表示の並び替え

 普通データが表示される場合新しいデータが先に表示されるようになっています。(一部のプログラムではその設定も初期設定で変えられるものもありますが)
 本来はデータは古いものから蓄積されていますので、殆どの場合はその順番をわざわざ逆順にして表示している訳です。ただ使用目的によっては古いものから表示したい場合もあります。その場合の対処方法としては2種類の方法があります。
 プログラムをよく見るとデータの表示部分にデータをリバースしている部分があります。
 一つの場合はデータを開いた後に

   @DATA = <IN>;
   @DATA = reverse(@DATA);
   $all = @DATA;

 のように@DATAをreverseしている場合で、この場合はその部分を削除して

   @DATA = <IN>;
   $all = @DATA;

 とすれば古いデータが先に表示されます。
 もう一つの場合はデータの条件に合ったものを表示する時に

   unshift(@hits, $_);

 などなっている場合

   push(@hits, $_);

 と書き換えれば古い記録の順に表示されます。
 またその他にデータを記録する時に逆順に記録している場合、記録部分に

   unshift(@new,$new_line);

 と書かれている場合は

   push(@new,$new_line);

 と書き換えればデータは古い順番に記録されます。

データの項目の追加・削除

 データの項目を追加したり削除したりする場合はかなり緻密に全体を見回す必要があります。
 データはいろんな部分でオープンされ、加工されたりしますからCGIの中をよく見回して、データ形式、データの数などを全部揃える必要があります。
 ただこれもコツさえつかめばわりと簡単に行えます。

データの条件の追加・削除

 必須項目などの追加・削除もわりと簡単に行えます。入力チェックの項目が必ずありますから、その前後を見て同じ形式で足したり必要のないものは削除することが出来ます。大抵 if 文か elsif 文で構成されています。
 またデータ形式、例えばメールアドレスやURL等の書き込み形式のチェックなどはいくつかのCGIプログラムを見てみますと必ずどこかで見つかりますから、それを参考に条件に追加すれば簡単に行えます。

総論

 CGIを改造する場合重要なことは最初に書いてありますように、HTMLが分からない人は手を付けたらいけないと言うことと、もう一つ大切なことはあちこちのCGIをダウンロードしてみてそれぞれをよく見てCGI独特の書式を理解する必要があると言うことです。
 そうすればどんな場合はどうしたら良いか他のCGIプログラムを参照して手を加えていくことができます。