各種定型サブルーチン

 Perlで掲示板スクリプトなどを作っている時、色々な追加機能を持たせようと思ったら、それぞれ定型のサブルーチン群を使うといいでしょう。他のプログラム言語でも、よく使う処理は別途関数にまとめて使い回しするようになっています。

ドメインネーム

 掲示板などにおいて、訪問者がどのような「プロバイダ」や「サーバー」でアクセスしているか、そのドメイン名を知る事が出来ます。実際に使う時は以下のように書いて、処理結果を変数に格納してから利用します。

$hostaddr = &domain_name;

sub domain_name {
local($addr) = $ENV{'REMOTE_ADDR'};
local($_) = gethostbyaddr(pack("C4",split(/\./,$addr)),2);
if ($_ eq '') { $_ = $addr; }
$_;
}

local関数・・・引数として取っている変数を、サブルーチン、関数内などでローカルとして扱うようにします。

gethostbyaddr関数・・・引数で指定したインターネットホストのホスト名を返します。アドレスからホスト名に変換します。

pack関数・・・指定された引数に基づいてバイナリ文字列にパックします。ここでの引数"C4"は、「C」がunsigned charを、「4」が反復数を表しています。又、この反復数はデータ引数が使われる数を指定し、結果のバイナリ文字列にパックされます。

インラインリンク

 コメントの中にURLやメールアドレスが書き込まれている時に、自動的にリンクを貼るサブルーチンです。コード内容は既に解説済みのものですから、そう難しくはないと思います。実際に使う時は以下のように書いて、コメント部分を処理します。

$comment = &inline_link($comment);

sub inline_link {
local($_) = $_[0];
$_ =~ s/([^=^\"]|^)((http|ftp):[!#-9A-~]+)/$1<a href=$2 target=_top>$2<\/a>/g;
$_ =~ s/([!#-9A-~\-\_]+\@[!#-9A-~\-\_\.]+)/<a href=mailto:$1>$1<\/a>/g;
$_;
}

([^=^\"]|^)・・・「http」の直前の文字が「=」「"」以外か、文章の先頭であることを表す。

[!#-9A-~]・・・半角の英数字と記号を表す。「!」と「#から9」と「Aから~」の意味。ASCIIコード表を見てね!

$1,$2・・・Perlのマッチ演算子は、左から数えた左括弧「(」の順に「$1,$2,$3」と格納されます。ですから、ここの場合、「$1」に直前文字が格納され、「$2」にアドレスが格納される事になります。

タグチェインジ

 一旦無効にしたタグ処理を、再び有効化する時の関数です。「タグの無効化処理」と全く逆の処理を施しています。実際に使う時は記事の書き込みの部分に、以下のような処理を加えます。

$QUERY{'comment'} = &tag_change($QUERY{'comment'});

sub tag_change {
local($_) = $_[0];
1 while s/(.*)(&lt;(img([!-:A-~\s\=]+))&gt;)/$1<img$4>/i;
1 while s/(.*)(&lt;(font[\s\w\=\#\"\']+)\&gt;(.*)\&lt;\/font\&gt;)/$1<$3>$4<\/font>/i;
1 while s/(.*)(&lt;(b)&gt;(.*)&lt;\/b&gt;)/$1<b>$4<\/b>/i;
1 while s/(.*)(&lt;(i)&gt;(.*)&lt;\/i&gt;)/$1<i>$4<\/i>/i;
1 while s/(.*)(\[\[(.+)\]\])/$1<table border=4><tr><td>$3<\/td><\/tr><\/table>/i;
$_;
}

SSIについて 前へ

HOME

次へ ASCIIコード表