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

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

第7回 記事取得2

記事内容の取得の最終回です。

ヘッダの整形

59行目

  $head=~s/<\/?A[^>]*>//g;

記事のヘッダから、<A>タグを除去します。 「T:<A HREF=...>タイトル</A>\n」とあれば、「T:タイトル\n」となります。

正規表現の内容は、まず「<」を探します。 次に「/」が0個か1個あるか調べて、続いて「A」があるか調べます。 「>」以外の文字が0個以上続いていて「>」があれば一致します。 s///の最後の「g」はオプションで、置換対象の文字列を全て置換する意味です。

↑では、$head内で一致した全ての文字を置換することになります。

60行目

  $head=~s/&([a-z]+);/$unamp{$1}/eg;	# 特殊文字デコード

記事のヘッダの特殊文字を変換します。例えば、「&lt;」とあれば「<」に置換します。
&に続いてaからzのアルファベットが1個以上あり、;が付く文字に一致します。 [a-z]と書くとaからzという意味になります。 ちなみに数字の場合は[0-9]となります。
置換内容は「$unamp{$1}」という変数です。 これはハッシュと言われるものです。 ハッシュとは配列に分かりやすい名前を付けたものです。

$data{name} = 'GETWILD'; $data{age} = 28;

とすれば、利用する時に何が入っているか分かりやすいんです。 名前を出力したい場合は

print $data{name};

とすればいいわけです。nameやageはキーと言います。 普通の配列をやってないので便利さがあまり伝わらないかも知れないですが。

例を上げると普通の配列の場合は

$data[0] = 'GETWILD'; $data[1] = 28;

と添字と言われる番号で考えなくてはいけないので分かりにくいですね。

それから配列そのものを表すには、

普通の配列 @data
ハッシュ %data

とします。代入する時は↑に直接入れることも出来ます。

配列
@data = ('GETWILD', 28);
ハッシュ
%data = ('name','GETWILD', 'age',28);
ハッシュの別の書き方
%data = ('name' => 'GETWILD', 'age' => 28);

話を戻して、「%unamp」に何が入っているかですが。 CMLIBの初期設定(init)で定義されています。

 %unamp=("gt",">",   "lt","<",   "quot","\"",  "amp","&",  "nbsp"," ",
		 "39","\'", "34","\"");

HTMLにおける表示用の文字をキーにして、実際の文字を格納しています。

$unamp{'gt'} = ">";

というのをまとめて代入しているだけです。 $1には()内の文字が入るのでしたね。

<」とすれば「lt」が$1に入ります。 そうすると置換するのは「$unamp{'lt'}」となります。
$unamp{'lt'}の中には「<」が入ってますので、 「&lt;」は「<」に置換されることになります。

s///の最後のオプション「e」は置換内容をPerlの構文として実行する ということを表しています。 しかし、$unamp{$1}は単なる変数なので、なくても動きそうな気がします。

記事本文の取得とCMT出力

62行目

  /<BLOCKQUOTE>([^\xff]*?)<\/P>/; $_=$1;

記事の本文を取得します。 <BLOCKQUOTE></P>で囲まれた部分の最短マッチです。 「\xff」以外の任意の文字列を指定しています。 文字コードに詳しくないので「\xff」が何だか分かりません。(^^; たぶん通常の文字列には入らないコードを表してるのではないかと思います。 違ってたらすいません。 そして、マッチしたものを「$_」に代入しています。

63行目

  s/<img[^>]*?src *= *\"?([^\"> ]*)[^>]*>/[画像: $1]/ig;

先ほど抽出した記事本文の中にIMGタグがあれば整形したものに置換します。 [画像: 画像のパス]という形式に直しています。

65行目と66行目

  print	"S:$num,$rnum,$date,\n",$head;			# 記事ヘッダ出力
  &wrtmes($_,$udata);						# 本文の出力

CMTファイルに記事のヘッダと本文を出力しています。 「&wrtmes」は本文の内容を整形して出力します。 例えばタグを取り除いたりしています。

67行目

  $nextnum=$num+1;

これは特に利用されてないみたいです。 何かのなごりでしょうか。

今回はここまでとします。 次回はページめくり処理と最終処理です。 一応、次回でISLANDプラグインの解説は終了です。

キーワード

Prev : Next


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

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