HTMLでホームページを作り始めると、やがて、はまりだすのが、CGI。カウンターから掲示板から、アクセスログまで、様々に使えるこの、CGI。CGIによって、サーバー側で、HTML言語をつくり、それをHTTPにおくると、ブラウザーに画面を出したりできます、
DB2/400のように、自由自在にリレーショナルDBができるわけではありませんが、カウンターの値をサーバーに保管したり、メッセージを、掲示板用に保管したり、と言った簡単なテキストファイルへの保管をしたい場合、一般的に、Perlを使っているようです。正式な統計なんて知りませんが、見た限り、70%から80%近くはPerlではないでしょうか。
Perlそのものは、10年以上前からある言語です。構文的にはわかりやすくて、テキスト関係の命令語を豊富に持っているのが特徴です。そもそも、Perlは、CGI用にできたわけではなく、Unixのスクリプト言語として、成長してきて、ついでに、CGIとしても使われてきた、という感じです。ここでは、CGIに焦点をあてて、話をしてみたいと思います。
ここでは、以下の内容を知っている、という前提で話をします。
- HTMLの構文など
- JavaScriptがどんなものか
データ入力などでは、HTMLがCGIを参照する部分は、<form>のなかの属性 actionに指定されます。<form>文は、値の入力を可能にして、SUBMITボタンで、サーバーにそのデータを渡すことができます。このとき、呼び出す、プログラム(CGI)を指定できるわけです。当然ですが、ここに、自作のCGIを設定できます。そのCGIは、あらかじめ、サーバーにアップロードされていなくてはいけません。エンドユーザーが、ブラウザから、<form></form>の中で文章を入力して、submitボタンを押すと、その文章は、サーバーに渡され、そのactionに指定されたCGIプログラムが呼び出され、そのCGIが、HTMLを作成して、HTTPサーバーが、それをブラウザに渡し、エンドユーザーが参照します。
ところで、なんだか、RPGの対話型プログラムに、似ていませんか?
ここで、かなり、思い切った(乱暴極まりない)説明を試みましょう。
- www(http)サーバーを、AS/400とする。
- wwwブラウザを、5250のスクリーンとする。
- HTMLデータを、画面ファイルとする。
- cgiプログラムを、対話型RPGプログラムとする。
この、前提で話をすると、
RPGの場合
- プログラマーは予め、画面ファイルとRPGを作成して、AS/400のライブラリーに登録する。
- エンドユーザーが、5250を起動して、RPGを呼び出す。
- RPGは、定義されている画面ファイルを5250スクリーンに送り、その入力画面が表示される。
- エンドユーザーが、何かしらデータを入力して、実行キーを押下する。
- RPGは、入力バッファを通して、データを受け取り、処理を開始して、結果を画面ファイルに出力する。
- エンドユーザーは、5250上で、画面ファイルをとおして、RPGの処理結果を見る。
CGIの場合
- プログラマーは予め、cgiを作成して、サーバー上のフォルダーに登録する。
- エンドユーザーが、ブラウザーを立ち上げて、cgiを呼び出す。
- そのcgiが作成した、入力画面用HTMLを、ブラウザーが表示する。
- エンドユーザーが、何かしら、データを入力して、submitボタンを押下する。
- 呼び出されたCGIは、環境変数などから、入力データをで受け取り、処理を開始して、結果をHTML文章として出力し、ブラウザーに送信する。
- エンドユーザーは、ブラウザーで、HTMLで作成された画面で、CGIの処理結果を見る。
ここでのポイントは、あくまでHTMLは、ブラウザ画面に文字列を、それなりに修飾して、表示する程度のものであるということです。cgiは、HTMLを生成して、表示したいデータを、ブラウザに手渡しているのです。Perlは、そのままでは、DOS窓に結果を戻せますが、ブラウザに処理結果を出せません。Perl内で、出力はHTMLだと、httpサーバーに前置きして、さらにhtmlストリングの山を自力で作り出さなくては、処理結果をブラウザに表示できません。RPGでいえば、こまごまと、<xxx></xxx>というデータストリームを作って、書き出しているのと同じです。もっと、大胆に言うと、RPGの中でDSPFのDDSを作成して、コンパイルして、表示しているようなもの、です。表示するレイアウトと表示したいデータをHTMLを利用して、エンドユーザーに表示しているのです。まあ、HTMLを自動生成して、httpサーバーに投げつけているのがCGIということですね。
ブラウザに表示するためには、
- 適切にセットアップされたhttpサーバーが活動していること
- PerlなどでかかれたCGIが、httpが認識できるフォルダーにあること
が前提です。
ちなみに、AS/400にhttpサーバーを立てたときは、RPGをCGIにすることもできるようです。
AS/400e HTTP
Server for AS/400 Web Programming Guide
(英語版)
なお、JavaScriptは、Local側(つまり、自分のPC側)で、動く、スクリプト言語です(CGIは、サーバー側)。JavaScriptを、DDS-RPGで考えるならば、まあ、DSPFのキーワードに近いでしょう。Perlでは、JavaScirptもテキストとして、生成して、ユーザーの入力ミスなどを制御できます。それから、くどいようですが、HTMLとCGIとの接点(インターフェイス)は、form文です。
PCのHTTPサーバー上で、CGIとして使える言語はたくさんあるようです。その中のひとつが、Perlです。この言語の特徴は、テキストを扱うことが得意な言語のようです。合成、抽出、検索、これらを割合と簡単に指定できます。
さて、ここでは、Perl言語の構文をあっさりおさらいして(これは、自分の備忘録なのですが...)、よそ様の作ったPerlを読めるようにしましょう。ちなみに、Perlの構文自体は、AS/400の世界で言えば、どちらかと言えば、RPGよりもCLPに近いものです。
変数、定数の指定の仕方
1命令の終了
; (セミコロン)
コメント
#
スカラー変数の接頭語
$
(スカラー変数というのは、RPGで言うところの普通のフィールドのことです。)
配列の接頭語
@
ハッシュ(連想配列)の接頭語
% (これは、変わった配列ですが、RPGで表すとすると、2つの配列で表現できます。1つは、Keyを格納する配列で、もうひとつはデータを格納する配列です。Key配列にLookupして見つかった指標で、データ配列を見るようにすると、このハッシュになります。なお、keyにあたる部分の並び順は、保証されていません。)
サブルーチン呼び出し
& (&ReadParseとするだけで、サブルーチンを呼び出しとことになります。これは、どちらかというと、ユーザー定義関数に近いものです。)
メタ文字
- \n Newline
- \r Return
- \t Tab
- \u 続く一文字のみ大文字
- \l 続く一文字のみ小文字
- \U 以降の文字すべて大文字
- \L 以降の文字すべて小文字
構文
数値演算
足し算 + $a=1+2;
引き算 - $a=2-1;
掛け算 * $a=2*3;
割り算 / $a=6/2;
剰余 %
$a=5%3;
文字演算
文字列連結 .(ピリオド)
$a="AAA" . "BBB";
文字列掛け算 x (まあ、*ALL(...)見たいなものです)
$a="=-=-=-"x 3;
配列関連
添え字は[ ] で表示。 $a=array[1];
添え字は0から開始。
配列のコピー @array1 = @array2;
配列のクリア @array = ();
配列の最大の添え字 $#配列名
配列の最後の要素に追加/削除 push / pop
配列の先頭の要素に追加/削除 unshift / shift
要素の一部を別のリストで置き換える
splice
配列の要素を、区切り文字で連結して、文字列にする
join
文字列を、区切り文字で分解して、配列にする
split
昇順並べ替え sort
配列内容を逆に並び替える reverse
降順に並び替え reverse( sort( @配列 ) )
配列要素をひとつづづ処理 foreach
この他、正規化など、ストリング命令がたーくさんありますが、以下を参照してください。
Resource in English
The Home of Perl
Perl advocacy services
The home of the Perl Mongers (The de
facto Perl user group)
Comprehebsive Perl Archive Network (CPAN)
A nice collection of Perl resources.
Perl Month magazine.
Resource in Japanese
Perl初心者の部屋
CGI・Perl入門
スクリプティング言語資料室(仮)
とほほのWWW入門
※独立してPerlを使う場合と、CGIで使う場合は、若干、記述方法が違いますので、書籍購入するときは、注意してください。CGIとして使いたい場合、書籍でいえば、「CGI/Perl...」などと出ているものを選びましょう。「Perl」だけだと、CGIにする場合の記述方法は、書いてなくて、Perlを一般的なプログラミング言語として使う場合のことに終始しています。