今回は記事内容の取得部分の処理です。
52行目
/^(\d+)\>>/; $num=$1;
記事Noの取得をしています。
/^(\d+)\">/
で、記事Noを抜き出しています。
「^」は$_に入っている文字列の一番最初からを意味し、
「()」は囲まれた中身を「$n」という特殊な変数に代入します。
「$n」のnは「()」の出て来た順番に応じて数字が決まります。
1番目に出て来たら「$1」、2番目なら「$2」という具合です。
「\d+」は「\d」が数字を意味していて、「+」は一つ以上のという意味なので、
「\d+」で1つ以上の数字が並んでいたらということになります。
「\"」は単に「"」という文字を表しています。
「>」も単に「>」という文字です。
最終的には「123">」などのような文字を探すことになります。
続いて
$num=$1
ですが、「$num」は記事Noを格納する変数です。 ここに先ほどの「()」内に取得したものを代入しています。 説明したように「()」の中身は「$1」に自動的に代入されています。 上の「123">」の例で行くと、「123」が記事Noとして「$num」に代入されます。
53行目
$rnum="*"; $rnum=$1 if(/Prev: *<A HREF=\"#(\d+)\">/);
$rnum="*"
「$rnum」は返信元の記事Noを格納する変数です。 親記事であれば返信元はないので、デフォルトで「*」を代入しています。
$rnum=$1 if(/Prev: *<A HREF=\"#(\d+)\">/);
「if」の条件式が真ならば、条件式内で取得した「()」内の文字を返信元の記事Noとします。
条件式は
/Prev: *<A HREF=\"#(\d+)\">/
「Prev:」の後に半角空白が0個以上続き、「<A HREF="#」の後に数字が1個以上 続いて、「">」がある部分に一致するかどうかとなります。 これは返信元へのリンクを利用してるのですかね。 数字(\d+)の部分に「()」があるので、返信元No($1)にはその数字が入ります。
55行目
s/<B>(.*?)<\/B>//; $head ="T:$1\n"; # タイトル
記事タイトルを取得して、CMTヘッダ用に整形して$headに代入しています。
s/<B>(.*?)<\/B>//
<B>タグで囲まれている部分を調べて、一致したら<B>タグも含めて
$_から削除しています。
「.*?」の「.」は任意の1バイトの文字
「*」はその前に記述されているものが0個以上
「?」は最短マッチ、ちなみに「?」がなければ最長マッチになります。
この違いの例を示してみます。
$_='<B>abc<\/B><B>cde<\/B>'; # 最短マッチ /<B>(.*?)<\/B>/; $1に入るのは「abc」 # 最長マッチ /<B>(.*)/; $1に入るのは「abc<\/B><B>cde」
$head ="T:$1\n"
「$head」にはCMTファイルに書き込まれる記事のヘッダが格納されます。 記事タイトルとか名前とかメールアドレスなどですね。
"T:$1\n"
T:は記事のタイトルを意味します。 $1は先ほどの処理で抜き出されたタイトルです。 「\n」で改行してCMTに書き出す記事のタイトル部分の完成です。
56行目
$udata=&geturl($_,$head); # HP/Mailアドレスの抽出
HPアドレスとメールアドレスを抽出します。 「$udata」には本文の後ろにくっ付く各アドレスが格納されます。
「&geturl」は各アドレスを抽出するサブルーチンです。 引数は「$_」と「$head」で、それぞれ読み込んだHTMLのソースと CMTファイルに出力する記事ヘッダです。 このサブルーチンは$headにアドレスがあればセットして、 戻り値として本文の後ろに付けるアドレスを整形して返します。 戻って来た値を「$udata」に代入しています。
57行目
s/<B>(.*?)<\/B>//; $head.="N:$1\n"; # 名前
タイトルの時と同じ要領で投稿者名を抽出します。
s///の記述がタイトルの時と同じなので、タイトルが抽出されそうですが タイトルの抽出時に空文字で置換して削除しているので、次に一致する ものを抽出することになります。
抽出したもの($1)を「$head」に代入しますが、そのまま入れてしまうと タイトルの時に入れたものが上書きされてしまいます。 「.=」として「$head」に格納されているものに「N:$1\n」をくっ付けています。 「"T:タイトル\nN:名前\n"」というような感じです。
今回はここまでとします。 次回で記事内容の取得部分の話が終わる予定です。
今回は特にないです。今までに書いた内容の応用なので。