あたらしものずきっ!

試してみたものとか、遊んでみたものを色々記してみます。

ファイルの読み書きと掲示板ぽいの完成?

あとはファイルへの書き込みを残すのみ。ファイルハンドラを明示指定する必要があるため調べてみた。

  • < : 読み込み
  • > : 上書き書き込み
  • >> : 追加書き込み
    • 書き込み時は、共通してファイルの作成も兼ねる。

頭に

+

をつけると読み書き兼用になる。が、解説サイトによっては

+

が、読み書きはできても、「追加」「上書き」「新規作成」ができない、となっていた。追記も上書きもできない書き込みって何なんだろうか。…空の状態からの書き込み限定?

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(/<>/,$_);

ブラウザでアクセスして、適当に投稿してみた。