今回から記事取得の処理に入っていきます。
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を足しています。
記事が見つかったので、記事数をカウントしているんですね。
今回はここまでとします。 次回は記事の内容の取得部分に入ります。