トップ>Perl&CGI>基本編目次>INCMプラグインで覚えるPerl講座5

INCMプラグインで覚えるPerl講座

第5回 日付判定

今回から記事取得の処理に入っていきます。

巡回のはじめ、区切りやループなど

38行目

 $atclmax=0;		# 1ページに最大いくつの記事が有るか

39行目

ATCL:{

ATCL」はラベル名です。 「{}」で囲まれた部分をブロックと言いますが、これに名前を付けています。 「ATCLブロック」内に1ページ分の記事取得処理が記述されています。 複数ページ読む場合、大抵のプラグインはこの「ATCLブロック」を繰り返しています。 同じ処理を繰り返すことをループと言います。

コメントの通り、「$atclmax」は1ページの最大記事数を格納する変数です。 これに0を入れて初期化しています。 詳しい話はこの変数が実際に使われてる部分でします。

40行目

 $atclcnt=0;		# 各ページ毎の記事数

$atclmax」は最大ページ記事数ですが、「$atclcnt」はページごとの記事数が入ります。 スレッドタイプやツリータイプについては親記事を数えることが多いです。 ここでも変数の初期化をしています。

41行目

 $page+=1; print STDOUT "\nPage $page:";
$page+=1

これは分かりにくいですが、計算を簡略化した書き方です。普通に書くと

$page = $page + 1

となりますが、「$page+=1」と書いても同じ結果になります。 「$page」というのは名前で分かる通り「ページ数」が入っています。 ここ以前の行で何も代入してないので、何も入っていなかったものに 1を足していますが、結果は1になります。

print STDOUT "\nPage $page:"

これは巡回ウィンドウに現在取得中のページ数を出力しています。

43行目

$/="\n<A NAME=\"";						# 区切り

$/」は特殊変数で、ファイルやアクセスした掲示板などの読み込み時に この変数に入っている内容ごとに区切った単位で読み込みます。

ここでは、「\n<A NAME=\"」となってますので、
改行+<A NAME="
ごとに区切られて読み込まれます。

44行目

while(<HTTP>){		# 区切り毎に、ファイル終端まで $_に読む

ブロック内を()の中の条件が真の間、繰り返す命令です。 プラグインではBBSのソースを読み込み終えるまで繰り返すことになります。 ここでは「$_」が省略されてますので、読み込んだ内容は「$_」に入ります。 先ほどの区切り単位で読み込まれることになります。

45行目

 print LOG $_; s/\r\n?/\n/g;

print LOG $_
はログファイルに読み込んだ内容をそのまま書き込んでいます。

s/\r\n?/\n/g

は、読み込んだソースの改行コードを「\n」に統一してます。

\r\n?」の意味は まず「\r」があるかどうか見てます。 次に「\n?」ですが、「?」はこれ以前に「\n」が0個か1個あるかどうか見てます。 あってもなくてもいいということですね。

これに一致するのは、 「\r」または「\r\n」になります。 これらはWindowsで使われている「\n」と異なるので、統一しているわけです。

日付、その他

46行目

 if($date=&getdate($_)){		# $dateに日付が取得出来たら記事とみなす

大抵は日付で記事を判定すれば上手くいきます。 「&getdate」は日付があれば、それを抽出整形して返すサブルーチンです。 このサブルーチンに読み込んだソースを渡しています。 戻り値は「YYYY/MM/DD,hh:mm」という未読ポインタに合わせた形式で返されます。 これを「$date」に代入しつつ、「if」で値が返されたかどうかを判定しています。 日付がない場合はifブロック内の記事取得処理をしません。

47および48行目

  last ATCL if($date lt $param2);	# 未読ポインタより古ければ終了
  $newptr=$date unless($newptr);	# 未読ポインタ更新

last」はループの最後に処理を移動する命令です。 「last ATCL」となってますので、ここでは「ATCLブロック」の終端に移動します。

その後ろに「if」があるので、この条件が真なら「last」が実行されます。 「if」の条件は先ほど取得した「$date」と「$param2(未読ポインタ)」を比較して、 $dateのほうが小さければ真ということになります。

lt」は文字列として比較する場合に「<」の代わりに使います。 「$newptr」は最新の未読ポインタを格納する変数です。 unless($newptr)としているので、「$newptr」が空なら未読ポインタを更新します。

50行目

  $date=~s/^..//;				# 年を2桁化

先ほど取得した日付をCMTファイル用に年を2桁にしています。 INCMで表示されているものを見ると年が2桁で表示されてますよね。

で、ここでの正規表現ですが、「^..」を調べています。

^」が$dateの一番先頭から調べるという意味で、 「.」は任意の値を示しています、2つあるので2桁を表しています。 置き換え部分が空になっているので、一致する部分を消すということになります。

具体的には

2002/05/19,00:00

なら

02/05/19,00:00

という風に変換されます。

51行目

  print STDOUT "*"; $atclcnt+=1;			# 読み取り状況表示

print STDOUT "*"
で「*」を巡回ウィンドウに出力しています。

日付が見つかったので、記事があるとして「*」を一つ出力するわけです。

$atclcnt+=1
は、$pageの時と同じで記事数を格納する変数に1を足しています。 記事が見つかったので、記事数をカウントしているんですね。

今回はここまでとします。 次回は記事の内容の取得部分に入ります。

キーワード

Prev : Next


トップ>Perl&CGI>基本編目次>INCMプラグインで覚えるPerl講座5

©Copyright 2002 GETWILD'74 All Rights Reserved
E-Mail:getwild@mail.wind.ne.jp