こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

perlでファイルへの書き込みができません!

perlでファイルへの書き込みができません!
教えてください.
webプログラミング初心者なのですが,

フォームから送信されたデータをshift-jisに変換させてからbbs1.txtへの内容の書き出しを行いたいのですが,

#!/Applications/XAMPP/xamppfiles/bin/perl
print "Content-type: text/html; charset=utf-8\n\n";

# フォーム部分を表示する
print <<EOL;
<html>
<body>
<h2>一行掲示板</h2>
<form method="post" action="bbs1.cgi">
メッセージ:<input type="text" name="message" size="60">
<input type="submit" value="送信">
</form>
<hr>
EOL

&ReadParse(*form);

# フォームの値を取得
$message = $form{"message"};

use Encode;
use Encode::Guess qw(euc-jp shiftjis 7bit-jis);
encode("shiftjis",decode('Guess',$message));

# ログファイル読み込み
open(IN, "bbs1.txt");
@log = <IN>;
close(IN);

# メッセージが入力されているときは書き込み処理を行なう
if ($message ne "") {
# ログ先頭にメッセージを格納
unshift @log, "$message\n";

# ログファイルに書き込み
open(OUT, "> bbs1.txt");
print OUT @log;
close(OUT);
}

# ログ表示
foreach $data (@log) {
chop $data;
print "$data<br>\n";
}

print "</body>\n</html>\n";

このような感じにし実行して後でtxtファイルを見ると何も書かれていません><
なぜでしょうか...?
教えて下さい><
今気づいたのですがそれに関連してなのかログも表示されていませんでした...><
txtファイルのアクセス権は読み書き可になっています

encodeはあえてつかっています.

投稿日時 - 2011-11-13 16:45:34

QNo.7130838

すぐに回答ほしいです

質問者が選んだベストアンサー

適当。表示がくずれるので、空白2文字を全角空白にしていることに注意

use strict;
use warnings;
use CGI;
use CGI::Carp qw(fatalsToBrowser);
use CGI::Pretty;
use Encode;
use Fcntl ':flock';

use constant LOG_FILE => '/tmp/data.txt';

my $q   = new CGI;
my $sended = $q->param('send');
my $text;
if ( defined $sended ) {
  my $message = $q->param('message');
  $text = overwrite_file( LOG_FILE, $message );
}
else {
  $text = read_file(LOG_FILE);
}

my $script_name = $q->script_name;
my $html    = << "END_HTML";
<html>
  <body>
    <h2> one line comment</h2>
      <form method="post" action="$script_name">
        Message : <input type="text" name="message" size="60">
        <input type="submit" name="send" value="send">
      </form>
      <hr>
      <pre>$text</pre>
  </body>
</html>
END_HTML

print $q->header( -type => "text/html", -charset => 'UTF-8' ), $html;

### Sub Routines

sub read_file {
  my $file = shift || die "Require file";

  my @lines = ();
  if ( open my $fh, '<:encoding(shiftjis)', $file ) {
    flock $fh, LOCK_EX;
    @lines = <$fh>;
    close $fh or die "$!:$file";
  }
  return join q{}, @lines;
}

sub overwrite_file {
  my $file = shift || die "Require file";
  my $message = shift;

  my @lines = ();
  my $exist;
  my $fh;
  if ( open $fh, '+<:encoding(shiftjis)', $file ) {
    $exist = 1;
  }
  else {
    open $fh, '>:encoding(shiftjis)', $file or die "$!:$file";
    $exist = 0;
  }

  flock $fh, LOCK_EX;
  if ($exist) {
    @lines = <$fh>;
    seek $fh, 0, 0;
    truncate $fh, 0;
  }

  $message .= "\n";
  my $utf8
    = Encode::is_utf8($message)
    ? $message
    : Encode::decode_utf8($message);
  unshift @lines, $utf8;
  print {$fh} @lines;

  close $fh or die "$!:$file";
  return join q{}, @lines;
}

投稿日時 - 2011-11-13 21:37:43

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

回答(1)

あなたにオススメの質問