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

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

第6回 記事取得1

今回は記事内容の取得部分の処理です。

記事番号の取得

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"」というような感じです。

今回はここまでとします。 次回で記事内容の取得部分の話が終わる予定です。

キーワード

今回は特にないです。今までに書いた内容の応用なので。

Prev : Next


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

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