その他にもどる
構文諸々
色んな構文を載せる予定
●新しい記事を追加する
●記事や画像の削除
●記事の編集
●画像のアップロード
●コメントの記録と編集
●コメントにリンクを張る
●日時の取得
■データーの並べ替え
■文字の検索を行う
■複数のファイル操作
■<option>に別ファイルのデーターを取り込む
■項目別にカントし、記録させる
■<input type=checkbox>など
上の●印は test.zip 内の test.cgi に組み込まれている(BBSページ参照)
↑PageTop
新しい記事を追加する
例えば 名前 と 住所 を入力し、その後にデーターファイルに書き込む場合
&lock;
open(IN,"$logfile") || &error("$logfileを開くことができません");
@lines = <IN>;
close(IN);
($bno) = split(/,/, $lines[0]);
$no = $bno + 1;
unshift (@lines,"$no,$in{'name'},$in{'add'},\n");
open(OUT,">$logfile") || &error("$logfileに書き込めません");
print OUT @lines;
close(OUT);
&unlock;
|
↑PageTop
記事や画像の削除
下のように 削除NOを入力できるようにする
print "<form action=\"$script\" method=\"POST\" enctype=\"multipart/form-data\">\n";
print "<input type=hidden name=mode value=\"sakujyo\">\n";
print "記事NO<input type=text name=no size=4>\n";
print "<input type=submit value=\"削除する\"></form>\n";
下のような画面になる
削除処理は下のように書く
sub sakujyo {
if ($in{'no'} eq ''){ &error("削除Noが入力されていません"); }
&lock;
open(IN,"$logfile") || &error("$logfileを開くことができません");
@lines = <IN>;
close(IN);
$flag=0;
@new=();
foreach (@lines) {
($no) = split(/,/);
if ($in{'no'} eq "$no") { $flag=1;if (-e "$no.jpg"){ unlink("$no.jpg"); }
}
else { push(@new,$_); }
}
if ($flag == 0) { &unlock;&error("該当記事が見当たりません"); }
open(OUT,">$logfile") || &error("$logfileに書き込みできません");
print OUT @new;
close(OUT);
&unlock;
&header;
print "削除処理完了しました<br>\n";
print "TOP画面は <a href=$script?mode=top>こちら</a> です\n";
&footer;
exit;
}
↑PageTop
記事の編集
まず、編集NOを入力できるようにする
print "<form action=\"$script\" method=\"POST\" enctype=\"multipart/form-data\">\n";
print "<input type=hidden name=mode value=\"hensyu\">\n";
print "記事NO<input type=text name=no size=4><br>\n";
print "<input type=submit value=\"編集する\"></form>\n";
入力画面は下のようになる(お名前と住所が記録されているとして)
sub hensyu {
if ($in{'no'} eq ''){ &error("編集NOが入力されていません"); }
open(IN,"$logfile") || &error("$logfileを開くことができません");
@lines = <IN>;
close(IN);
foreach (@lines) {
($no,$name,$add) = split(/,/,);
if ($in{'no'} eq "$no") { last; }
}
$comment =~ s/<br>/\n/g;
$comment =~ s/<a href=\"(.*)\"(.*)>(.*)<\/a>/$1/g;
&header;
print "<form action=\"$script\" method=\"POST\" enctype=\"multipart/form-data\">\n";
print "<input type=hidden name=mode value=\"hensyu2\">\n";
print "<input type=hidden name=no value=\"$in{'no'}\">\n";
print "おお名前<input type=text name=name size=20 value=\"$name\"><br>\n";
print "ご住所<input type=text name=name size=60 value=\"$add\"><br>\n";
print "<input type=submit value=\"更新する\"></form>\n";
&footer;
exit;
}
そして書き込み処理は下のようになる
sub hensyu2 {
&lock;
open(IN,"$logfile") || &error("$logfileを開くことができません");
@lines = <IN>;
close(IN);
@new=();
foreach (@lines) {
($no) = split(/,/,);
if ($in{'no'} eq "$no") {
$_ = "$no,$in{'name'},$in{'add'},\n";
}
push(@new,$_);
}
open(OUT,">$logfile") || &error("$logfileに書き込みできません");
print OUT @new;
close(OUT);
&unlock;
&header;
print "更新完了しました;<br>\n";
print "TOP画面は <a href=$script?mode=top>こちら</a> です\n";
&footer;
exit;
}
↑PageTop
画像のアップロード
下のように type=file を書き足す
print "<form action=\"$script\" method=\"POST\" enctype=\"multipart/form-data\">\n";
print "<input type=hidden name=mode value=\"toko\">\n";
print "お名前<input type=text name=name size=20><br>\n";
print "画像<input type=file name=upfile size=60><br>\n";
print "<input type=submit value=\"投稿する\"></form>\n";
下のような画面になる
投稿処理の部分に、if を入れる(&lockや&openはファイル操作ページ参照)
sub toko {
(略)
&lock;
open(IN,"$logfile") || &error("$logfileを開くことができません");
($logfileに書き込み処理を行う)
if ($in{'upfile'}) {$ImgFile = "$no.jpg";&UpFile; }
&unlock;
(略)
$no.jpg は 投稿NOが 30 の場合は 30.jpg という画像名になる
拡張子が jpg となっているが、gif や png もこれで大丈夫
また画像を img というフォルダーに置く場合は ./img/$no.jpg と書く
sub UpFile は下のように書く
sub UpFile {
$upfile = $in{'upfile'};
open(OUT,"> $ImgFile") || &error("画像のアップロードに失敗しました");
binmode(OUT);
binmode(STDOUT);
print OUT $upfile;
close(OUT);
chmod (0666,$ImgFile);
}
↑PageTop
コメントの記録と編集
コメントを記録したい場合は下のように name=comment を書き足せばできる
print "<form action=\"$script\" method=\"POST\" enctype=\"multipart/form-data\">\n";
print "<input type=hidden name=mode value=\"toko\">\n";
print "お名前<input type=text name=name size=20><br>\n";
print "コメント<br><textarea name=comment cols=60 rows=10 wrap=soft></textarea><br>\n";
print "<input type=submit value=\"投稿する\"></form>\n";
下のような画面になる
※コメントに改行があった場合、改行の部分は <br> が付けられ保存される これはデコード処理部分(sub decode)にその命令が書かれているから
それでは、コメントを編集する場合は、<br> を改行に戻す必要がある
(略)
$comment =~ s/<br>/\n/g;
&header;
print "<form action=\"$script\" method=\"POST\" enctype=\"multipart/form-data\">\n";
print "<input type=hidden name=mode value=\"hensyu2\">\n";
print "<input type=hidden name=no value=\"$in{'no'}\">\n";
print "おお名前<input type=text name=name size=20 value=\"$name\"><br>\n";
print "コメント<br><textarea name=comment cols=92 rows=10 wrap=soft>$comment</textarea><br>\n";
print "<input type=submit value=\"更新する\"></form>\n";
↑PageTop
コメントにリンクを張る
コメントの欄にURLが入力された場合、これにリンクを張りたい時に使う
例えば、コメント欄に下のように入力されたとして、
私のホームページは http://www.aso.ne.jp/watashi/ です。
このような場合にリンクを張るには、まず下を準備する
sub auto_link {
$_[0] =~ s/([^=^\"]|^)(http\:[\w\.\~\-\/\?\&\=\@\;\#\:\%]+)/$1<a href=\"$2\" target='_blank'>$2<\/a>/g;
}
そして書き込み処理の前に下のように書く
&auto_link($in{'comment'});
(書き込み処理)
※ただし、コメントの編集画面を作る場合は、もとに戻さなければならない 編集画面の前に下の行を追加する
$comment =~ s/<a href=\"(.*)\"(.*)>(.*)<\/a>/$1/g;
↑PageTop
日時の取得
日時は time で管理されます。例えば、
$time = time
&header;
print "$time\n";
と書くと、10桁の数字が出現する これは1970年1月1日からの秒数と決まっている
この10桁の数字を日時表現にするには変換が必要
$ENV{'TZ'} = "JST-9";
$time = time;
($sec,$min,$hour,$mday,$mon,$year,$wday) = (localtime($time))[0..6];
@week = ('日','月','火','水','木','金','土');
$date = sprintf("%04d年%02d月%02d日(%s) %02d時%02d分%02d秒",
$year+1900,$mon+1,$mday,$week[$wday],$hour,$min,$sec);
&header;
print "$date\n";
と書くと、2011年11月28日(月) 20時10分30秒 のように表示される
また、
$ENV{'TZ'} = "JST-9";
$time = time;
($min,$hour,$mday,$mon,$year,$wday) = (localtime($time))[1..6];
@week = ('Sun','Mon','Tue','Wed','Thu','Fri','Sat');
$date = sprintf("%04d/%02d/%02d(%s) %02d:%02d",
$year+1900,$mon+1,$mday,$week[$wday],$hour,$min);
&header;
print "$date\n";
と書くと、2011/11/28(Mon) 20:10 のように表示される
また、2011/11/28(月) 20:10 を 11/28 だけを表示させたい時は substr という関数を使う
(略)
$date2 = substr($date,5,5);
&header;
print "$date2\n";
と書くと、11/28 と表示される(先頭の5文字を消し、次の5文字を出力している)
※どの表現でもいいが、データーを保存する場合は、あとで便利な表現を選べばよい
↑PageTop
データーの並べ替え
表示する順番を反対にしたい場合は、&open; のすぐ後ろに reverse を置く
open(IN,"$logfile") || &error("$logfileを開くことができません");
@lines = <IN>;
close(IN);
@lines = reverse(@lines);
配列の3列目を昇順に並べ変える方法は、
@lines = map {$_->[0]} sort {$a->[3] <=> $b->[3]} map {[$_, split /,/]} @lines;
また、配列の3列目を降順に並べかえるには、(aとbを入れ替える)
@lines = map {$_->[0]} sort {$b->[3] <=> $a->[3]} map {[$_, split /,/]} @lines;
2列目を優先し昇順に、次に3列目を降順に並べかえる方法は、
@lines = map {$_->[0]} sort {$a->[2] cmp $b->[2] or $b->[3] <=> $a->[3]} map {[$_, split /,/]} @lines;
※文字列の並べ替えを行う場合は map の代わりに cmp を使えばよい
↑PageTop
文字の検索を行う
指定した特定の文字が含まれているデーターだけを抽出したい場合は、
まず、検索窓を設ける
print "<form action=\"$script\" method=\"POST\" enctype=\"multipart/form-data\">\n";
print "<input type=hidden name=mode value=\"kensaku\">\n";
print "<input type=text name=kensaku size=20>\n";
print "<input type=submit value=\"左の文字を検索する\"></form>\n";
下のような画面になる
下のようにすれば抽出できる(データーにお名前とコメントが保存されていたとして)
sub kensaku {
if ($in{'kensaku'} eq "") { &error("文字が入力されていません"); }
&header;
print "<A HREF=JavaScript:history.back()>もどる</A><br><br>\n";
print "<b>$in{'kensaku'}</b>が含まれる記事を\表\示します。<br><br>\n";
print "<table width=680 border=1><tr>\n";
print "<th width=60>NO<th width=120>お名前<th width=500>コメント</th></tr>\n";
open(IN,"$logfile") || &error("$logfileを開くことができません");
@lines = <IN>;
close(IN);
foreach (@lines) {
($no,$name,$comment) = split(/,/);
$data = "$name$comment\n";
if (index($data,"$in{'kensaku'}") >= 0) {
$name =~ s/$in{'kensaku'}/<font color=red>$in{'kensaku'}<\/font>/ig;
$comment =~ s/$in{'kensaku'}/<font color=red>$in{'kensaku'}<\/font>/ig;
print "<tr><td>$no</td>";
print "<td>$name</td>";
print "<td>$comment</td>";
print "</tr>\n";
}
}
print "</table>\n";
&footer;
exit;
}
<font color=red> の部分で検索後の文字を赤色に変換している
↑PageTop
複数のファイル操作
例えば、商品と送料の情報を二つのファイルに保存しておき、同時に表示させたい場合で、
まず、先頭部分にファイル名を指定しておく
$logfile = "syohin.log";
$logfile2 = "souryo.log";
書き込みを行う時は下のようになる(souryo.log の場合)
open(IN,"$logfile2") || &error("$logfile2を開くことができません");
($logfileに書き込み処理を行う)
open(OUT,">$logfile2") || &error("$logfile2に書き込みできません");
print OUT @lines;
close(OUT);
↑PageTop
<option>に別ファイルのデーターを取り込む
例えば注文フォームで商品名を選択する際、別のファイルに商品の情報が保存されている場合で、
前項の「複数のファイル操作」で書いているが、商品情報のファイルを syohin.log として、先頭部分にファイル名を指定しておく
$logfile2 = "syohin.log";
注文フォームは下のようになる(お名前と商品を記録するとして)
print "<form action=\"$script\" method=\"POST\" enctype=\"multipart/form-data\">\n";
print "<input type=hidden name=mode value=\"tyumon\">\n";
print "お名前<input type=text name=name size=20><br>\n";
print "商品名<select name=syohin size=1>\n";
print "<option>下から選んでください</option>\n";
open(IN,"$logfile2") || &error("$logfile2を開くことができません");
@lines = <IN>;
close(IN);
foreach (@lines) {
($no,$shina,$kakaku) = split(/,/,);
print "<option>$sub($kakaku)</option>\n";
}
print "</select><br>\n";
print "<input type=submit value=\"注文する\"></form>\n";
syohin.log には NO、商品名、価格 の順に保存されている場合 オプションを $sub($kakaku) としているので、商品名(価格) のように表示される
下のような画面になる(例)
商品名の表示の順番を並べ変えたい時は、構文諸々のページを参照
↑PageTop
項目別にカントし、記録させる
例えば下のような、data.log というデーターファイルあったとする D列はお米の予約数量
5kg、10kg、20kg毎にカウントし、count.log に記録するとする
unlink count.log;
open(OUT,">count.log");
print OUT @lines;
close(OUT);
my %count = ();
open(IN, "data.log");
while(<IN>){
chomp;
my @d = split(/,/,);
$count{$d[3]}++;
}
close(IN);
foreach (keys %count) {
open(IN,"count.log");
my @lines = <IN>;
close(IN);
($no) = split(/,/, $lines[0]);
$no++;
unshift (@lines,"$_,$count{$_}\n");
open(OUT,">count.log") || &error("count.logに書き込みできません");
print OUT @lines;
close(OUT);
}
先頭の unlink はファイルを一旦消去し、リセットしている
---- End ----
↑PageTop その他にもどる