今回はページめくり処理から最後までです。
44行目のwhile文から69行目の}までのループを抜けると 1ページ分を読みきったということです。
73行目
last ATCL if $local; # ローカルファイルなら抜ける
は、コメントの通りローカルでのインポートなら次のページが
ないので、ATCLの記事取得ループを抜けて最後の処理に行きます。
「last」はループ処理を終わりにする命令です。
「next」なら今のループをそこで止めて次のループに入ります。
74行目
last ATCL unless $param2;
$param2には&initで読み込んだ未読ポインタが入っています。 設定していない場合は何も入りません。 この文では「unless」で$param2が真でなかったらATCLを抜ける 処理をしています。 ようするに未読ポインタがなければ、次のページは読まないという ことになります。
76行目
$atclmax=$atclcnt unless $atclmax; # 最初のページの数がページ毎の最大値に
$atclmaxには1ページ内の最大記事数が入ります。 この文では$atclmaxが空なら51行目でカウントして$atclcntに格納した 1ページの記事数を代入します。
77行目
last ATCL if($atclcnt != $atclmax); # 最大値より少ないなら最終ページ(終了)
1ページ内の最大記事数より今回の記事数が少ない場合は、その掲示板の 最終ページであるという判断をして、ATCLを抜ける処理をしています。
79行目
print "\nConnecting...";
これは巡回ウィンドウに接続中を示すメッセージを表示します。 が、STDOUTが抜けているので、CMTファイルに書き込んでしまってます。 記述ミスみたいですね。このプラグインを使ってる人は
print STDOUT "\nConnecting...";
に直したほうがいいでしょう。
80行目
$uri=~s/\?.*$//; $uri.="?i1=".($page*$atclmax);
$uri=~s/\?.*$//;
は、読み込むURLの?以降のCGIへの引数を削除しています。 「\?」はそのまま「?」を示し、「.*」は任意の文字が続き、 「$」それらを対象文字列の最後から調べます。 「bbs.cgi?id=123&page=2」なら「bbs.cgi」になります。
$uri.="?i1=".($page*$atclmax);
は、$uriに「?i1=」という文字列と「($page*$atclmax)」の結果を連結しています。 $pageにはここまでに読み込んだページ数が入っています。 それと1ページの最大記事数を掛けた数値が連結されることになります。 たとえば今が2ページ目で、最大記事数が10なら、 2×10で20という数値が連結され、結果として「?i1=20」というのが $uriに入っている文字にくっつきます。
$uri = 'bbs.cgi';
なら、「bbs.cgi?i1=20」が$uriの中身になります。
81行目
if(&httpreq("")){ &gettitle; redo ATCL; }
&httpreqは設定されたアドレスに接続するサブルーチンでしたね。 今度は$uriにはページめくり用の引数が付いています。 なので、アクセスしたら次のページが読み込まれるはずです。
if(&httpreq(""))
としてるのは、サーバ混雑などで読み込まれない場合もあるので、 読み込まれた場合だけ次の記事取得処理に入るようにしています。 「&gettitle」は前に説明したようにタイトルタグからCMTヘッダ用の タイトルを取得をしています。 でもCMTファイルには書き出していません。 すでに書き出してあるので必要ないからです。 では、なぜこの処理をしてるのかというと、HTTPヘッダを読み飛ばすためだと考えられます。 HTTPヘッダには日付が入っていたりするので、記事と誤認識されては困るからです。
「redo ATCL」はATCLループの先頭に戻るように指示しています。 「redo ラベル」で、そのラベルの所まで戻ってブロック内の処理を実行します。 次のページを読み込めたので、記事の取得処理をしろってことですね。
83行目
print STDOUT "\nPage ",$page+1," and before cannot read."; # 読めなかった
81行目で読み込みに失敗した場合に巡回ウィンドウにメッセージを出力します。
87行目
&fin;
85行目がATCLブロックの終わりです。 そこを抜けて来たら最終処理をします。 「fin」というのは最終処理をするサブルーチンです。
48行目でセットした$newptrで未読ポインタを更新したり、 「open」で開いたファイルなどをクローズしています。
88行目
print STDOUT " - done.";
巡回ウィンドウに終了メッセージを出力しています。
89行目 は24行目のif(&init)の終端です。 24行目では初期設定が成功なら巡回を始めるんでしたね。
90行目
exit;
プログラムの実行を終了します。 INCMならプラグインの動作を終了して、巡回が終わることになります。
以上でISLANDプラグインでの解説を終わります。 次回は実際にプラグインを作成しながら、Perlでのプラグイン作成方法に ついて講義していきたいと思います。 題材はドムーパさんからリクエストのあった「ちびぼーど」です。
ベースにするのはサンプルプラグインでもいいんですが、今回説明に 使ってきた「ISLAND」でやってみましょう。 行き当たりばったりなので、完成しなかったらすいません。(^^;
特になし