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