[←Back]   3. 簡単なCGIプログラムを作ってみよう  [Next→]

   3-1 まずは4則演算
perlの基本は次の通りです。
   ・文の末尾にははセミコロン( ; )をつけます。
   ・通常の変数にはダラー( $ )を付けて表わします。
   ・print は「"....." を表示せよ」という命令です。
   ・\n は「改行せよ」という意味を持ちます。

つまり、C言語とかなり似てますね。$x = 5;「変数$xに値5を代入する」 という意味になります。
…と、これだけ分かれば次のプログラムが作れます。

#!/usr/local/bin/perl
print "Content-type: text/html\n\n";
$x = 1;
$y = 2;
$z = $x + $y;
print "$z \n";
exit;
1行目の #!/usr/local/bin/perlは、CGIを書くときのおまじないのようなものです。
C言語でも、#include<stdio.h>とかありますよね。
2行目では、ブラウザに"これから返却するデータはHTMLだよ"と教えています。

これを実行すると、画面には「3」と表示されました。 当たり前と言えば当たり前なのですが、なにげにこのプログラムも苦労しました。 print "$z \n";のところを、print "z \n";と書いたせいでエラー起きまくり。 perlの場合、変数には毎回ダラー( $ )をつける必要があるみたいです。


   3-2 for文を使ってみる
基本的なfor文の書き方は、
 for (変数 = 初期値; 変数 <= 終端値; 変数++){文}
というわけで、C言語とほとんど同じです。

#!/usr/local/bin/perl
print "Content-type: text/html\n\n";
for ($i=1; $i<=9; $i++){
  for ($j=1 ;$j<=9; $j++){
  $k = $i * $j;
  print"$k ";
  }
print "<BR>\n";
}
exit;
このプログラムを実行すると、掛け算の九九が表示されます。


   3-3 if文、elsif文 (おみくじを作ろう)
if文、elsif文もほとんどC言語と同じです。
あえて言えば、C言語では「else if」なのがperlでは「elsif」であることくらいかな?
これを使って、おみくじを作ってみました。
JavaScriptでも余裕でできるけど、細かいことは気にしない…

#!/usr/local/bin/perl
print "Content-type: text/html\n\n";
$a=srand;
$a=rand(5);
if (0 <= $a && $a <=1) {
        print "大吉\n";
    } elsif (1 < $a && $a <= 2) {
        print "中吉\n";
    } elsif (2 < $a && $a <= 3) {
        print "小吉\n";
} elsif (3 < $a && $a <= 4) { print "凶\n"; } else { print "大凶\n"; } exit;
ここで、
 $a=srand; はランダム数値の初期化
 $a=rand(5); は、aに0以上5未満の数をランダムに代入
です。これを実行すると、大吉、中吉…がランダムで表示されるはずです。
ただ、 if (0 <= $a && $a <=1) { の部分を
 if (0 <= $a <=1) {
とするとエラーになりました。う〜ん…


   3-4 ファイル入出力 (簡単なカウンターを作ろう)
次に、ファイル入出力に挑戦しました。
まず下準備として、count.txtを用意します。(名前は何でもOK)
中身には適当な数字を書いて、実行するCGIと同じフォルダに入れておきます。
で、CGIのほうは下みたいになります。

#!/usr/local/bin/perl
open(IN, "count.txt");
$x = <IN>;
close(IN);

$x++;
open(OUT, "> count.txt");
print(OUT "$x \n");
close(OUT);

print "Content-type: text/html\n\n";
print "<HTML>";
print $x;
print "</HTML>";
exit;
説明に行ってみましょう。
ファイルのオープンにはopen関数を使います。使い方は次の通りです。
 ・open( FILE, "xxx.txt");  ファイルを読み込みモードでオープンする
 ・open( FILE, "> xxx.txt");  ファイルを書き込みモードでオープンする
 ・open( FILE, "+< xxx.txt");  ファイルを読み書きモードでオープンする
 ・open( FILE, ">> xxx.txt");  ファイルを追加書き込みモードでオープンする

ここで、FILEにあたる部分をファイルハンドルと呼びます。
ファイルハンドルの名称は任意でつけられますが、読み込みの場合はIN、書き込みの場合はOUT とすれば分かりやすいです。


   3-5 もっとデータが多くなったら?
前回のカウンターでは、count.txtにはカウントという1つのデータしかありませんでしたが、 読み込むデータが増えた場合はどうするでしょう?
この時には、splitを使います。splitは文字列を区切り文字で分割します。
これを使った例が、次のプログラムです。

#!/usr/local/bin/perl
print "Content-type: text/html\n\n";

$logfile = "log.txt";
open( IN, "$logfile" );
$data = <IN>;
close( IN );

($sec,$min,$hour,$mday,$mon,$year) = split(/:/, $data);
print "前回のアクセスは $year年$mon月$mday日$hour時$min分$sec秒<BR>\n";

$ENV{'TZ'} = "JST-9";
($sec,$min,$hour,$mday,$mon,$year) = localtime(time);
$year = $year + 1900;
$mon = $mon + 1;
print "今回のアクセスは $year年$mon月$mday日$hour時$min分$sec秒\n";
$newdata = "$sec:$min:$hour:$mday:$mon:$year";

open( OUT, ">$logfile" );
print(OUT "$newdata");
close( OUT );
exit;

上の例では、$dataを「:」という文字で区切って配列にしています。
例えば$dataが25:58:1:17:11:2000だったとすれば、 $sec=25,$min=58、$hour=1…となります

($sec,$min,$hour,$mday,$mon,$year) = localtime(time);
では、時刻を年月日時分秒などに分解しています。
ただし、月は0〜11、年は1900年からの年数 で値が返されるので、上のように修正してあげましょう。
そして、$sec:$min:$hour:$mday:$mon:$yearという形で再び書き込んでいるので、次にアクセスしたときに、 この時間が「前回のアクセス」になるわけです。



[←Back]   BACK   [Next→]