便利なサブルーチン関数集
|
| perl-lib.plの利用 |
|
- perl-libは、perlスクリプトに組み込むだけで高度な機能を簡単に実現する汎用の関数集です。
CGIへの組み込みは、
#!/usr/local/bin/perl
#日本語コード変換モジュール
require 'jcode.pl';
#関数ライブラリの読み込み
require 'perl-lib.pl';
|
|
これだけで、ライブラリが提供する全てのサブルーチン、関数をどこからでも呼び出すことができます。
機能アップの為、予告無く改変しています。定期的にダウンロードしてアップグレードしてください。
- 日本語文字列関数4種を追加 [2003/04/02]
- i-Modeメールアドレスに対応 [2003/03/02]
- GIF画像のサムネイル生成「sumnailcopy」関数を追加 [2003/03/01]
- ASCII文字だけに暗号化する「ascscramble」関数を追加 [2003/02/15]
本章では、省略できる添え字を[ ]で括って表示しています。
|
| 関数リファレンス |
|
html_head
html_head(bgcolor,text,link,vlink,alink[,background,topmargin,leftmargin,title])
ほとんどのCGIはhtmlドキュメントを返すよう作成されますが、html_head関数はhtmlのMimeタイプの宣言と、
htmlドキュメントのヘッダーを宣言します。
bgcolor | = | 背景色 |
text | = | 文字色 |
link | = | リンク色 |
vlink | = | アクセス済みリンク色 |
alink | = | アクセス中リンク色 |
background | = | 背景画像 |
leftmargin | = | 上余白 |
bgcolor | = | 左余白 |
title | = | ページのタイトル |
img_head
img_head[(flag)]
アクセスカウンタや、動的に画像を返すスクリプトでは画像のMimeタイプを宣言する必要が有ります。
flag = gif/jpeg/png
comma
comma(number)
数値に3桁ごとのカンマ「,」を挿入します。
number = 数値
readparts
readparts([Variable, Tag, Jcode])
フォームからのデータを指定した配列及び連想配列に格納します。
フォームがマルチパート(ENCTYPE=multipart/form-data)で送信された場合は、
指定されたファイルをアップロードすることもできます。
Variable | = | 格納する変数名
「%」型の連想配列だけでなく、「@」型の配列変数も使用されますので、
ここで指定した変数名を他のルーチンで使用することはできません。 |
Tag | = | 無効にする文字 |
Jcode | = | jis/sjis/euc
文字コードを指定します。
この引数を指定した場合は、jcode.plがインクルードされていなければなりません。 |
#!/usr/local/bin/perl
require 'jcode.pl';
require 'perl-lib.pl';
readparts('QUERY', '<>=', 'sjis');
|
|
この例は、フォームからのデータを%QUERY連想配列と@QUERYに格納すると同時に、
全てのタグを無効にしています。
send_email
send_email(sendmailpath,uuencodepath,subject,from,to,cc,bcc,body[,files,encoding])
ホームページから直接メールを送信します。
サーバに添付するファイルが存在すれば、送信するメールにファイルを添付することもできます。
sendmailpath | = |
UNIXのsendmailがインストールされているパス(/usr/lib/sendmail) |
uuencodepath | = |
バイナルファイルをエンコーディングするuuencodeのパス(/usr/bin/uuencode) |
subject | = | メールの件名 |
from | = | 送信者のメールアドレス |
to | = | 送信先のメールアドレス |
cc | = |
カーボンコピーで送信するメールアドレス |
bcc | = |
ブラインドカーボンコピーで送信するメールアドレス |
body | = | メール本文 |
files | = | 添付するファイルのパス |
encoding | = |
エンコーディングの種類
(バイナリファイル=uuencode/テキストファイル=text) |
#!/usr/local/bin/perl
require 'jcode.pl';
require 'perl-lib.pl';
$sendmail = '/usr/lib/sendmail';
$uuencode = '/usr/bin/uuencode';
readparts('QUERY', '<>=', 'sjis');
$subject = 'ありがとうございました';
$master = 'info@trythehomepage.com';
$body = 'ご登録ありがとうございました。';
$body .= '今後ともよろしくお願いします。';
&jcode'convert(*subject,'jis');
&jcode'convert(*body,'jis');
$err = (send_email($sendmail,$uuencode,$subject,$master,$QUERY{'email'},'','',$body,'',''));
$err && &error_view($err);
html_head('#FFFFFF','#000000','#FF0000','#0000FF','#00FF00','',0,0,'');
print "<center>\n";
print "<table border=1><tr><td bgxolor=#FFFFAA><font size=2>\n";
print $body;
print "</font></td></tr></table>\n";
print "</center>\n";
print "</body></html>\n";
exit;
|
|
sendmailが使用可能な環境では、これだけでホームページからメールを送信することができます。
当サイトがご紹介するホームサーバの構築でBlatjがインストールされている場合は、
Windowsサーバからでもメールが送信できます。
data_read
data_read(data_path)
data_pathに指定したデータファイルを読み込み、配列変数に格納します。
data_path = データファイルのパス
data_save
data_save(data_path, WRITE_DATA)
WRITE_DATA配列変数の内容をdata_pathに指定したデータファイルに保存します。
独自方式による強力なファイルロックシステムで大切なデータを保護します。
保存に成功した場合はヌルを、失敗した場合は失敗した原因を返します。
data_path | = | データファイルのパス |
WRITE_DATA | = | 保存データが格納された配列変数 |
#!/usr/local/bin/perl
require 'perl-lib.pl';
$err = data_save('log.txt', @DATA);
$err && &error_view($err);
|
|
この例では、配列@DATAを「log.txt」というファイル名で保存しています。
失敗した場合は、エラーの原因を取得してエラーメッセージを表示します。
upload
upload(autoname,filetype,format,dir,max,permission,mode[,variable])
マルチパートに対応したブラウザ(InternetExplorer4、Netscape3以上)から
直接パソコンのファイルをサーバにアップロードします。
テキスト文書はもちろん、画像ファイルや、圧縮された書庫ファイルなどバイナリファイルもアップロードできます。
Autoname | = |
0:元のファイル名のまま保存。 同じファイル名が存在する場合は上書きされる
1:自動的に重複しないファイル名を作成して保存 |
filetype | = |
アップロードを許可するファイルの種類
ヌル('')に設定するとすべてのファイル、'image'を指定すると画像ファイルに限定 |
format | = |
アップロードを許可する画像ファイルの種類
filetypeが'image'に設定されている場合に有効で、jpeg/gif/pngが指定できる |
dir | = |
アップロードされたファイルを保存するディレクトリのパス |
max | = |
アップロードを許可するファイルの大きさ
これを超えるファイルはアップロードできない。0を指定するとすべてのサイズ |
permission | = | 保存後のファイル属性 |
mode | = |
テキストファイルとバイナリファイルの改行コードが異なるOS(Windows)からUNIXや、
Linuxのようなサーバにテキストファイルをアップロードする場合は改行コードを揃える必要があります。
このような場合はmodeに'text'を指定します。
Windows98,MeからWindowsNT,Windows2000等の同一系サーバにアップロードする場合は指定する必要はありません。
また、LinuxからUNIXの場合も同様です。 |
variable | = |
cgi-lib.plのReadParse関数に渡した変数名 |
#!/usr/local/bin/perl
require 'jcode.pl';
require 'perl-lib.pl';
readparts('QUERY', '<>=', 'sjis');
@UPFILES = upload(1,'image','jpeg','./upload/',0,644,'','QUERY');
@FILE = split(/\t/, $UPFILES[0]);
foreach (@FILE) {
($key, $value) = split(/=/, $_);
$FILE{$key} = $value;
}
$FILE{'err'} && &error_view($FILE{'err'});
|
|
このサンプルでは、自動でファイル名を作成し、
jpeg形式の画像だけをuploadというディレクトリにファイルの大きさを限定しないでアップロードし、
パーミッションを644に設定しています。
upload関数は、ファイルのアップロードに関するさまざまな情報を返します。
name | = |
アップロードされたフォームのフィールド名 |
local | = |
アップロードされたファイルのローカルパス |
filename | = | 保存されたファイル名 |
filetype | = | ファイルのタイプ |
format | = | 画像の種類 |
err | = |
エラーメッセージ
アップロードするファイルがない場合も'UploadFile Not Select'を返す |
tag_change
tag_change(String)
Stringに指定した文字列中で、安全なタグ(イメージ<img>、ボールド<b>、
イタリック<i>、フォント<font>、アンダーライン<u>)だけを有効にします。
これら以外のタグはそのまま表示されます。
String = 変換する文字列
String中のタグは、予め無効に変換されていなければなりません。
$string =~ s/</</g;
$string =~ s/>/>/g;
readparts('QUERY', '<>=', 'sjis');で取得したデータは自動的に変換されています。
tag_check
tag_check(String, FREETAGS)
Stringに指定した文字列中で、FREETAGSで許可したタグだけを有効にします。
これら以外のタグや、「>」で閉じられていないタグ、 「</font>」のように
閉じタグの必要なタグで閉じタグが見つからない場合は完全に削除されます。
String | = | 変換する文字列 |
FREETAGS | = | 許可するタグのリスト |
#!/usr/local/bin/perl
require 'jcode.pl';
require 'perl-lib.pl';
readparts('QUERY', '<>=', 'sjis');
html_head ('#FFFFFF','#000000','#FF0000','#0000FF','#00FF00','',8,8,'');
print "<form action=lib-test.cgi method=POST>\n";
print "<textarea name=string cols=80 rows=10>$QUERY{'string'}</textarea>";
print "<input type=submit value=送信>\n";
print "</form>\n";
print "<font size=2>\n";
$QUERY{'string'} = tag_check($QUERY{'string'}, 'div', 'center', 'p','font','u','i','b', 'img');
$QUERY{'string'} =~ s/\r/<br>/g;
print "$QUERY{'string'}<hr>\n";
print "</font>\n";
print "</body></html>\n";
exit;
|
|
この例では 'div', 'center', 'p','font','u','i','b', 'img'のタグを許可してtag_check関数を呼び出しています。
無効なタグや、閉じ忘れられたタグはソースからも削除されますので安全に、
しかも高速に動作させる事ができます。
筆者のサイトのようにCGIを解説したページや、タグを解説したページのサポート用掲示板では、
タグを表示させて、対処法や、アイデアを解説する必要がありますので、
タグを完全に削除するtag_check関数ではなく、無効にするが表示するtag_change関数を使用する必要がありますが、
一般的に掲示板では完全に削除して高速に動作するtag_check関数をお薦めします。
inline_link
inline_link(String[, Changestring])
Stringaに指定した文字列中で、「http://」や、「ftp://」で始まるインターネットのURLまたは、
メールアドレスに自動でリンクを付けます。
String | = | 変換する文字列 |
Changestring | = | アドレスを置き換える文字列 |
domain
domain(Flag)
CGIにアクセスされた訪問者のホスト名を取得します。
Flag | = |
0:IPアドレスを含むフルアドレスを取得
1:IPアドレスを削除したドメイン名を取得 |
掲示板などでは、フルアドレスを取得する事である程度個人を特定できます
(プロバイダの協力が必要)ので悪戯防止にも効果が有りますが、
プロバイダごとの統計を取る場合はIPアドレスが毎回異なる為集計する事ができません。
このような場合は、Flagに1を設定する事でサーバ、ドメイン名だけを取得する事ができます。
user_agent
user_agent()
CGIにアクセスされた訪問者のブラウザの種類を取得します。
自動的にブラウザを取得する事で、ブラウザの機能に合わせたページを作る事ができます。
【主なブラウザ】
Internet Explorer | = |
Mozilla/4.0 (compatible; MSIE 5.5; Windows 98) 等 |
Netscape Navigator | = |
Mozilla/4.73 [ja] (Win95; U) 等 |
Docomo I-Mode | = |
DoCoMo/1.0/SH821i/c10 、DoCoMo/1.0/N501i 等 |
j-sky | = |
J-PHONE/3.0/J-D03 等 |
jst_time
jst_time(SerialTime[,Flag])
SerialTimeに指定したシリアル値をFlagの様式で日付と時刻の文字列に変換します。
Flag | = |
0:2001年5月25日 (金) 10:54:15
1:2001年5月25日 (金)
2:2001年5月25日
3:2001/5/25 (Friday) 10:54:15
4:2001/5/25 (Friday)
5:2001/05/25
|
progpass
progpass()
8桁のランダムな英数字のパスワード文字列を作成します。
@MEMBER = data_read('member.txt'); #会員データの読み込み
$pw = progpass; #パスワードを作成
while (1) { #同じパスワードが使われていないかチェック
#使われていなければ決定してループから脱出
if (!grep(/pw=$pw\t/, @MEMBER)) { last; }
$pw = progpass; #使われていればもう一度作成する
}
|
|
scramble
scramble(String,Flag[,Key])
Stringに指定した文字列を暗号化または、暗号化された文字列を元に戻します。
perlにも、crypt()という暗号化関数が用意されていますが、キーを指定できない為、
同じ文字は毎回同じ文字列に変換される。 2バイトの文字が20バイトにも大きくなってしまう。
日本語が文字化けしやすいなど実用的ではありません。
Scramble関数は開発者又は、使用者が自由にキーを設定でき、そのキーを使って、
いつでも元に戻す事ができます。もちろん日本語にも対応しています。
String | = |
変換する文字列 |
Flag | = |
1:暗号化
0:元に戻す |
Key | = |
暗号化するキーを数値で指定します。 |
キーは、何桁の数字でもかまいません。 Flagに「0」を指定して暗号化された文字列を戻す場合に、
このキーが一致しなければ、文字列を元に戻すことはできません。
#!/usr/local/bin/perl
require 'jcode.pl';
require 'perl-lib.pl';
readparts('QUERY', '<>=', 'sjis');
html_head ('#FFFFFF','#000000','#FF0000','#0000FF','#00FF00','',8,8,'');
print "<form action=lib-test.cgi method=POST>\n";
print "<textarea name=pass cols=80 rows=10>$QUERY{'pass'}</textarea>";
print "<input type=submit value=送信>\n";
print "</form>\n";
print "<font size=2>\n";
$scramble = scramble($QUERY{'pass'},1, 1024);
print "$scramble<hr>\n";
$scramble = scramble($scramble,0, 1024);
$scramble =~ s/\r/<br>/g;
print "$scramble<hr>\n";
print "</font>\n";
print "</body></html>\n";
exit;
|
|
この例ではフォームに入力された文字列を、キーに「1024」
という値を設定して暗号化し、同じく「1024」のキーで元に戻しています。
同じ文字列でも毎回異なる文字に変換されます。
キーは、何桁の数値でも設定可能ですから、データ内で必ず数値が格納されるフィールドをキーとして暗号化すると、
1件ごとにキーを変更する事ができます。
また、一度暗号化した文字列を別のキーでもう一度暗号化すればキーの種類は8649の8649乗となり、
天文学的数値になります。
次の例は、会員登録時の時刻のシリアル値から下4桁を取り出し、
その数値に管理者の設定したキー「1234」をプラスしたキーでパスワード、
氏名、電話番号、住所、メールアドレスを暗号化しています。
ほとんどの場合、登録した時刻が異なりますので1件ごとにキーは変更されます。
$datenow = time + $timelag * 3600;
$key = substr($datenow, 5, 4) + 1234;
$value = join("\t",
"code=$newcode",
"date=$datenow",
"pass=". scramble($pass, 1, $key),
"name=". scramble($QUERY{'name'}, 1, $key),
"tel=". scramble($QUERY{'tel'}, 1, $key),
"addr=". scramble($QUERY{'addr'}, 1, $key),
"email=". scramble($QUERY{'email'}, 1, $key),
"\n"
);
push(@MEMBER, $value);
|
|
このようにして保存されたデータは次のコードで正確に元に戻す事ができます。
%FIELD = fields($MEMBER[1]);
$key = substr($FIELD{'date'}, 5, 4) + 1234;
$FIELD{'pass'} = scramble($FIELD{'pass'}, 0, $key);
$FIELD{'name'} = scramble($FIELD{'name'}, 0, $key);
$FIELD{'tel'} = scramble($FIELD{'tel'}, 0, $key);
$FIELD{'addr'} = scramble($FIELD{'addr'}, 0, $key);
$FIELD{'email'} = scramble($FIELD{'email'}, 0, $key);
|
|
※perlのマニュアルcryptにも「正しい心の持ち主だけがこの関数を使用できる」
と記載されているとおり、scramble関数も同様です。
プログラムを公開しているのですからある程度プログラミングの経験のあるものは解読も可能ということです。
もっとも、1件ごとにキーが変更されていれば解読する意欲を無くしていただける事を期待して公開しました。
ascscramble
ascscramble(String,Flag[,Key])
使用法はscramble関数と全く同じですが、生成される暗号がASCII文字だけで構成されています。
この事により、暗号化されたパスワードや、メールアドレスをgrep関数で検索、抽出する事が可能になります。
また、日本語も暗号化してgrepで検索できます。
指定可能なキーは、0〜2048の整数です。
指定できるキーは少ないのですが、この暗号形式は暗号化されたサーバーでなければ複合化できません。
したがって、レンタルサーバーで作成された暗号をローカルサーバーなど、
他のサーバーで複合化できないと言うことになります。
当然、ローカルサーバーで作成したデータをレンタルサーバーにアップロードしても正常に動作しません。
※ホームページのお引っ越しをされる可能性が有る場合はscramble関数をご使用ください。
cookie_regist
cookie_regist(Cookiename,Cookielist,Date)
訪問者ごとに異なる情報をクッキーを使って訪問者のブラウザに保存します。
Cookiename | = |
クッキーの名称
CGIごとに変更しなければ誤動作する場合もあります。 |
Cookielist | = |
保存するキーと値のリスト |
Date | = | 保存する日数(最長60日が安全) |
@MEMBER = data_read('member.txt'); #会員データの読み込み
$value = join("\t", #会員フォーマットを整える
"id=$id",
"pw = $pw",
"name=$QUERY{'name'}",
"email=$QUERY{'email'}",
);
unshift(@MEMBER, $value); #会員データに追加
%Cook = cookie_regist('shop',"id=$id,pw=$pw", 30); #クッキーに保存
|
|
この例では、会員コードidと、パスワードpwを30日間の期限を付けて保存しています。
cookie_regist関数は、保存した内容を連想配列で返します。
したがって、クッキーに保存されたデータは、$Cook{'id'}、$Cook{'pw'}で参照できます。
cookie_read
cookie_read(Cookiename)
訪問者のブラウザにクッキーで保存されている情報を連想配列に取得します。
Cookiename | = | 保存した特と同じクッキーの名称 |
%Cook = cookie_read('shop'); #クッキーを取得
|
|
クッキーに保存されていたデータは、$Cook{'id'}、$Cook{'pw'}で参照できます。
age
age(BirthdayString, Timelag)
生年月日を指定して現在の年齢を返します。
BirthdayString | = | 生年月日を現した文字列(1958/02/17) |
Timelag | = | 世界標準時との時差(日本の場合は9時間) |
kaconv
kaconv(String)
Stringに指定した文字列中で、半角文字に変換可能な全角文字を半角に変換して返します。
金額や、生年月日をフォームで取得しても全角文字で記入されている場合は計算する事 (すべて0と判断される)ができません。
また、メールアドレスも全角ではメールを送信できません。
kaconv関数は数値やアルファベット、記号など半角に変換可能な文字を半角に変換します。
String = 変換する文字列
fields
fields(fields[, Separator])
Key=Value形式がSeparatorで区切られた1件のデータを分解してフィールドごとの連想配列に変換して返します。
fields | = | 一連のフィールドデータ |
Separator | = |
区切り文字(省略するとタブ\tになる) |
@MEMBER = data_read('member.txt');
$value = join("\t",
"id=$id",
"pw = $pw",
"name=$QUERY{'name'}",
"email=$QUERY{'email'}",
);
unshift(@MEMBER, $value);
|
|
この形式で保存されているデータファイルは次のようにしてアクセスできます。
@MEMBER = data_read('member.txt');
@DUMMY = grep(/id=$QUERY{'id'}\t/, (@MEMBER);
$match = 0;
foreach (@DUMMY) {
%MEMBER = fields($_);
if ($MEMBER{'pw'} eq $QUERY{'pw'}) { $match = 1; last }
}
if ($match) {
print "ありがとうございます。 すでに登録されています。\n";
} else {
print "申し訳ありません 会員以外ご利用いただけません。\n";
}
|
|
fcopy
fcopy(Src,Des[,Permission])
Src | = | コピー元ファイルのパス |
Des | = | コピー先ファイルのパス |
Permission | = |
コピー後のファイルの属性(省略すると644) |
rgb
rgb(Color)
色コードをRGBに分解した10進数に変換します。
Color = 色コード
kindex
kindex(String, Search)
漢字を含む文字列から指定した文字列を検索して最初に見つかった位置を返します。
先頭の文字を0としてカウントされます。
String | = | 漢字を含む文字列 |
Search | = | 検索する文字列 |
klength
klength(String)
指定した文字列の文字数を返します。漢字も1文字としてカウントされます。
String = 文字列
kreplace
kreplace(String, Oldstr, Newstr)
文字列中の指定した文字列を他の文字列にすべて変換します。
マッチ演算子では不可能な漢字を含むことができます。
String | = | 文字列 |
Oldstr | = | 置き換えられる文字列 |
Newstr | = | 置き換える文字列 |
ksubstr
ksubstr(String, Start, Length)
文字列の指定した位置から指定した文字数を取り出します。
perlのsubstr関数とほぼ同様な動作をしますが、漢字を含んだ文字列を処理できます。
String | = | 文字列 |
Start | = |
開始位置 最初の文字を0とする |
Length | = |
取り出す文字数 漢字も1文字とカウント |
$str = '高知県高知市西本町1-2-3番5号';
$str = ksubstr($str, 5, 3);
print $str;
|
|
deletedir
deletedir(Dir)
指定したディレクトリと、ディレクトリ内のファイルをすべて削除します。
weekday
weekday(date, timelag, flag)
指定した日付の曜日を返します。
date | = |
日付文字列(2004/06/12) |
timelag | = | 時差 |
flag | = |
1:日本語
0:数値 |
get_url
get_url(URL,Flag,Encode)
指定したURLのドキュメントを変数に取得します。
URL | = | ページのアドレス |
Flag | = |
0:内容を変数に取得
1:ページの存在のみ確認 |
Encode | = |
jis,sjis,euc から選択し指定 |
取得した内容は、連想配列$HTML{'Body'}に格納されている
エラーの確認は、$HTML{'Err'}に格納されている
|
|
|