• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:perlでファイルへの書き込みができません!)

perlでファイルへの書き込みができない!

このQ&Aのポイント
  • webプログラミング初心者のあなたが、フォームから送信されたデータをshift-jisに変換してbbs1.txtに書き込みたいが、何も書かれない問題に直面しています。なぜ書き込みができないのでしょうか?アクセス権やencodeの利用方法に問題はありません。
  • 実行後にtxtファイルを確認すると、何も書かれていません。また、ログの表示もされません。どのような原因が考えられるでしょうか?アクセス権は正しく設定されています。
  • perlを使用してwebフォームからのデータをshift-jisに変換し、bbs1.txtに書き込むプログラムを作成しましたが、書き込みがうまくいきません。何が原因でしょうか?アクセス権は適切に設定されていますし、encodeの使用方法も間違っていません。

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

  • ベストアンサー
回答No.1

適当。表示がくずれるので、空白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; }

関連するQ&A