Perl


▼Perl(パール)とはCGIを書くもの

UNIX上で開発されたファイル処理コマンドですが、MS-DOSにも移植されています。C言語と似た構文をもち、フリーソフトとして配布されています。 同様のコマンドにAWKなどがありますが、perlの方が多少記述力は高いようです。WWWにおいてCGIスクリプトを作成する際、CGIスクリプト内部 でperlを使用することが多いようです。

▼Perlの得意な分野

PerlはCGIを書くのに適した言語です。でも、CGIを書くためだけに開発されたものではありません。Perlという言語を簡単にあらわすと「テキストファイルを処理するのに適した言語」と言えます。CGIの内部処理ではテキストファイルを処理する事で事足りることが多いので、CGIの処理としてPerlがよく使われるのです。
しかも、PerlはUNIXやLinuxなどのOSではじめから備えられている場合が多く、サーバーから簡単に呼び出すことが可能です。

▼CGIにおいてのPerl

Perlの基本を述べるページはあちこちにあるので、ここではCGIを説明しつつPerlの文法を説明しようと思います。

CGIというと、ホームページから何かをクリックするタイミングでサーバー内でプログラムを動かして、その結果をホームページ上で表示するというのが一般的な概念ではないかと思います。
たとえば、アクセスカウンターや、掲示板、データの記録や表示などですが、仕組みさえ覚えてしまえばとても簡単なものです。
いろいろ、改良をして自分のためのCGIを作成するのも楽しいですよ。

DBとの連携でいろいろな情報を溜め込んだり表示したり分析したりも思ったより簡単にできます。DBの導入と設定は、自宅サーバーの説明を参照してください。

▼まずは、基本のアクセスカウンターから

ホームページを公開したら、どのくらいアクセスがあるかを知りたいですよねぇ。そのためにアクセスカウンターを設置する人が多数います。
インターネット上ではたくさんの無料のアクセスカウンターが公開されています。難しいことを考えたくない場合は公開しているアクセスカウンターを借りてきて自分のページに貼り付けるのが手っ取り早いですね。

ここでは、アクセスカウンターの仕組みと、Perlで簡単に作成する方法を説明します。つまり単純なアクセスカウンターの構造の説明とPerlの用法の説明です。

まず、簡単なCGIの作成の方法です。最初にPerlの存在場所を確認しておきましょう。
サーバーにTelnetで接続して確認しましょう。
[root@linux ~]# which perl  ← perlの場所を検索
/usr/local/bin/perl


カウンターの代表的なものには2種類あって、SSIを使う方式と、イメージを使用するものがあります。どちらも、ページが表示されると、CGIを起動して結果を表示するものです。

【SSIによるもの】
CGIはファイルを開いて、カントを読み出して1つ追加して保存してそのデータをプリントする。
受け取るページは、shtmlで、<!--#exec cmd="./CGI名"-->により、CGIを呼び出す。

<表示例>ここをクリックしてください

このCGIには、ファイルの読み出しと、書き出しの基本が含まれています。

ここで使っているCGIは単純なものですので、そのままでは実用に即しません。
#!/usr/bin/perl
$countfile = 'ssiCount.dat';
open(FH,"<$countfile");
$num = <FH>;
close FH;
$num++;
open(FH,">$countfile");
print FH "$num\n";
close FH;
print $num;
1行目は、パールのある場所を指定しています。
2行目はカウントデータファイルを指定しています。
3行目はファイルを読み出し用にOpenしています。
4行目は、変数$numに内容を読み出しています。
5行目でファイルを閉じています。
6行目で変数をインクリメント(1つ繰り上げ)します。
7行目は、ファイルを書き出し用にOpenしています。
8行目で数字をファイルに書き出しています。
9行目でファイルを閉じています。
10行目で、数値を書き出し(標準出力に)しています。
その結果を、shtmlファイルで受け取り表示しています。



【Gifによるもの】

基本は、SSIの場合と同じです。数値を画像ファイル(gifかjpeg)に変換するのと、10行目の標準出力のかわりに、HTMLに出力する部分を付け加えるだけです。

※数値を画像ファイルの配列にする方法
$digit = length($num);
for($i = 0;$i < $digit; $i++){
  $imgfile = substr($num,$i,1);
  $imgfile = "$IMGNAME$imgfile";
  $imgname = "$imagedir/$imgfile.gif";
  push(@counterimg,$imgname);
}
・画像ファイルが、$imagedirで指定したフォルダの中に、$IMAGNAMEで指定したファイル名+数字+.gif名で0〜9まで用意されている事が前提条件です。
(例えば、cnt5.gifのような名前)
1行目で変数$digitにカウントデータの桁数を保存する。
2行目はその桁数分の繰り返しの開始
3行目は、変数$imgfileに各桁の数値を渡します。
4行目は、ファイル名と、桁の数値をたしたファイル名を作ります。
5行目は、フォルダ(ディレクトリ名)を足してファイル名とします。
6行目は、配列@counterimgに画像ファイルを追加します。
7行目は、繰り返しの最後です。

次に表示部分ですが、ここでは、gifcat.plというライブラリを使用します。(とほほさんのライブラリページからダウンロードできます)
大半のカウンターがこのライブラリgifcat.plのお世話になっているといっても過言ではないかと思います。とほほさんありがとうございます。

このライブラリをCGIと同じディレクトリにアップロードして、属性を755に変更します。使用方法は次のようにします。
require './gifcat.pl';
print "Content-type: image/gif\n\n";

binmode(STDOUT);
print gifcat::gifcat(@counterimg);

表示例>←ここをクリックしてください

▼簡単にグラフを表示する

何かをグラフにして表示したい場合がありますね。その時はどうしたらいいのでしょうか?
簡単な方法が、データをCGIで取得したら表示するデータの割合を計算し、テーブルの中で画像を表示する時に、widthの大きさを%で指定する方法です。
データ1 77%
データ2 100%
データ3 33%
データ4 66%
データ5 44%

CGIを使ってホームページを表示する時に、上記のグラフと同じソースを使い、WIDTHの大きさを変数にして渡せば同じように表示できます。
この方法を使えばカウンターの値やデータベースの値を取り出してグラフにして確認するページを作成できます。

CGIによるグラフの表示例>←こちらをごらんください


▼掲示板って

▼データを保存して表示する(テキスト方式)

▼DB(データベース)をPerlでコントロールする