書き直し
Lesson3のあとにちゃんと書き直してみたかな?まだなら先を読んだらダメだよ。
use strict;
my $countlog = 'カウントを記録するファイルパス(絶対パス)/count.txt';
open(FO,"+< $countlog") || open(FO,"> $countlog");
my @temp = <FO>;
seek(FO,0,0);
my $count = join('',@temp);
$count += 0;
$count++;
print FO $count;
truncate(FO,tell());
close(FO);
exit;
だいたい理解できると思う。リファレンスの使い方もわかってきた頃だし解説も必要ない気がする。
違うところを大まかに説明すると、読み書きモードで読み込んだ後、seekでファイルポジションを先頭に戻す。で、編集後にtellで呼び出した今のファイルポジション以降をtruncateでカットする。そしてクローズだ。
ただ、ファイルサイズが増える一方のカウントファイルなのでtruncateは要らないね。
やっとこさ
WEBブラウザで読める用にしてみよう。CGIに興味ない人も新しいこと言うから読み飛ばさないでね。
use strict;
my $count = 0;
my $countlog = 'カウントを記録するファイルパス(絶対パス)/count.txt';
open(FO,"+< $countlog") || open(FO,"> $countlog");
my @temp = <FO>;
seek(FO,0,0);
$count = join('',@temp);
$count =~ s/[^0-9]//g;
$count++;
print FO $count;
truncate(FO,tell());
close(FO);
print 'Content-type: text/html'."\n\n";
print '<html><body>'."\n";
print "$count\n";
print '</body></html>'."\n";
exit;
$count =~ s/[^0-9]//g;
「=~」は演算子で左辺が右辺にマッチするという意味。基本的な式で例をだすと「$count =~ /abc/;」。意味は「$count」に「abc」の文字列が含まれていたら真となる。
「$count =~ /[abc]/;」なら「$count」に「a,b,cのどれか」が含まれていたら真となる。ここで出てきた「[abc]」といった表現方法を正規表現というんだ。詳しくは後のLessonで解説するよ。
また、「$count =~ /[^abc]/;」なら「$count」に「a,b,cのどれも」が含まれていなかったら真となる。
そして、「$count =~ /[^a-c]/;」は「$count =~ /[^abc]/;」と同じ意味で「-」は範囲を指定できる。[^a-z]なら半角英小文字全てが含まれて居なかったらとなる。
なら、「$count =~ /[^0-9]/」は数字以外だ。
さらに、「$count =~ s/A/B/;」とすることで最初にAにマッチした部分をBに置換してしまう。で、「g」は修飾子の仲間で、付けると繰り返しAをBに置換する。
だから、「$count =~ s/[^0-9]//g;」は「数字以外」を繰り返し「無字」に変換(要は消去)するよ。
Perlで使う正規表現はとんでもなくある。だからkimiはなるべく説明しなくてもいいように事を進めてきたけれど無理だった。
気付いていると思うけれど、これは「$count += 0;」がやっていたことを警告が出ないように実現する方法の一つだよ。
print 'Content-type: text/html'."\n\n";
ふつうのPerlのプログラムをWEBブラウザからアクセスして、WEBサーバー上で実行させても結果をWEBブラウザで見られない。
理由は簡単。WEBブラウザには結果が何がなんだかわからないから。そこで「print 'Content-type: text/html'."\n\n";」を一行入れてやるとWEBブラウザが「お、ここからtext/htmlだな」と判断できるようになるんだ。
その先は「html」をいつものようにprintで表示してあげればいいんだ。注意点は、プログラムソースと表示するhtmlの文字コードをそろえないと文字化けするよ。文字化けを防ぐ為にはmetaタグもprintしてあげてね。
すでにWEBサーバーをインストールしてとってもウズウズしている人は試してみよう!
ではではLesson4を終わるよ。ココまで来ればカウンターの要領で動く掲示板だって作れると思う。でもまだ不特定多数への公開は早まらないでね。
動いたから使っていいとは限らないんだ。セキュリティについてある程度知るまでは危険だよ。ある程度とはあいまいな表現で、もしすでに「わいは大丈夫や」と思っているならそれはそれでいいと思う。
がんばって楽しいCGIをいっぱい作ってね。まだ巣立たない慎重なかたはLesson5でまってるよ。