logo

その他にもどる

構文諸々

色んな構文を載せる予定

 ●新しい記事を追加する
 ●記事や画像の削除
 ●記事の編集
 ●画像のアップロード
 ●コメントの記録と編集
 ●コメントにリンクを張る
 ●日時の取得
 ■データーの並べ替え
 ■文字の検索を行う
 ■複数のファイル操作
 ■<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";

下のような画面になる
記事NO


削除処理は下のように書く
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 その他にもどる