ファイルの読み書きと掲示板ぽいの完成?
あとはファイルへの書き込みを残すのみ。ファイルハンドラを明示指定する必要があるため調べてみた。
- < : 読み込み
- > : 上書き書き込み
- >> : 追加書き込み
- 書き込み時は、共通してファイルの作成も兼ねる。
頭に
+
をつけると読み書き兼用になる。が、解説サイトによっては
+
が、読み書きはできても、「追加」「上書き」「新規作成」ができない、となっていた。追記も上書きもできない書き込みって何なんだろうか。…空の状態からの書き込み限定?
cd /Library/WebServer/CGI-Executables
su
password:
パス入力。
vim table5.pl
iキー。
#!/usr/bin/perl use strict; use warnings; use CGI; my $objCgi = new CGI; my $newname = $objCgi->param('name'); my $newmessage = $objCgi->param('message'); print $objCgi->header(-charset=>'UTF-8'); print <<EOM; <form method="POST"> <input type="text" name="name" /> <input type="text" name="message" /> <input type="submit" value="submit" /> </form> EOM if(!$newname || !$newmessage){ exit; } my $lockcount = 0; while(!mkdir("lock",705)){ $lockcount ++ ; sleep(5); if($lockcount > 5){ my $failmessage = "<p>"; $failmessage.= "Failed to access."; $failmessage.= "System is busy now."; $failmessage.= "Try again later.</p>\n"; print $failmessage; exit; } } open(DATA,">>data.log"); print DATA "$newname<>$newmessage\n"; close(DATA); open(DATA,"data.log"); my @LoadData = <DATA>; close(DATA); rmdir("lock"); print "<ul>\n"; foreach(@LoadData){ my($writename,$writemessage) = split(/<>/,$_); print "<li>$writename\n"; print "<ul><li>$writemessage</li></ul>\n"; print "</li>\n"; } print "</ul>\n";
escキー。
:save table5.pl
:quit
chmod table5.pl
ロック処理をカウントだけですませるのは微妙な気がしたので、sleepを挟んだ。指定した数の秒間だけ停止。
openの部分で、読み書きを同時に行おうとしたら、@LoadDataが空だったようで、メッセージが出力されなかった。
open(DATA,"+>>data.log"); print DATA "$newname<>$newmessage\n"; my @LoadData = <DATA>; close(DATA);
+を頭につけるメリットがあるのは、openとcloseの間をサブルーチンでケースバイケースに処理する時、ということか。
open(DATA,">>data.log"); print DATA "$newname<>$newmessage\n"; close(DATA); open(DATA,"data.log"); my @LoadData = <DATA>; close(DATA);
splitは最初の引数で、2つめの引数の変数内容を分割して配列として返す。$writenameと$writemessageを同時宣言して差し込んだ。
my($writename,$writemessage) = split(/<>/,$_);