- ベストアンサー
Perl BBSの改行処理と問題の解決方法
- Perl BBSの掲示板での改行処理について教えてください。今まではunshift関数を使用して改行処理を行っていましたが、use CGIモジュールを使用して変更しました。しかし、loadFormdata関数で問題が発生してしまいました。loadFormdata関数のどこを修正すればよいでしょうか?
- Perl BBSの掲示板での改行処理について教えてください。unshift関数を使用して書き込み処理を行っていましたが、use CGIモジュールを使用して書き込み処理の方法を変更しました。しかし、loadFormdata関数が動作しなくなってしまいました。loadFormdata関数の修正方法を教えてください。
- Perl BBSの改行処理について質問です。unshift関数を使用して書き込み処理を行っていましたが、use CGIモジュールを使用して書き込み処理の方法を変更しました。しかし、loadFormdata関数が正常に動作しなくなってしまいました。loadFormdata関数の修正方法を教えてください。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
>書き込まれる内容が全て「1」となって返ってきます。 失礼。うっかりミスです。 sub TransFormdata { $value = @_; の部分を sub TransFormdata { my $value; ($value) = @_; に修正して下さい。 「($value) = @_;」だと「引数に渡されて来たデータを$valueに代入」になるのですが、括弧で括るのを忘れて「$value = @_;」にしてしまいました。「$value = @_;」だと「引数の個数を$valueに代入」になってしまいます。 つまり「1」がリターンされてしまいます。
その他の回答 (1)
- chie65536(@chie65535)
- ベストアンサー率44% (8742/19841)
>この場合、 loadFormdataの部分のどこを変えればよいでしょうか? どこをどう変えても直らない。 loadFormdataは、CGI.pmを完璧に無視して、独自に取り出したデータを加工して「$FORM{$key}」に返している。 一方、書き込み処理は my $form = new CGI; my $NAME = $form->param('name'); my $TITLE = $form->param('title'); my $TEXT = $form->param('text'); の部分で「CGI.pmを利用して、変更も何もされてない、元データを取得」している。 つまり「やってる事が全然違う」ので「どこをどう変えても直らない」のです。 どうにかして直すのであれば「TransFormdataと言う名前で、取得済みデータを引数に与えたら、加工した値を返す関数」を呼んで、$NAME、$TITLE、$TEXTに入れる、と言う処理が必要になる。 つまり、以下のようにしないといけない。 |------書き込み処理------| sub printdata{ use CGI; my $form = new CGI; open(FILE, "<$FILE"); eval{ flock(FILE, 1) }; @DATA = <FILE>; close FILE; my $tm = time; my $NAME = TransFormdata($form->param('name')); my $TITLE = TransFormdata($form->param('title')); my $TEXT = TransFormdata($form->param('text')); unshift(@DATA,"$tm,$NAME,$TITLE,$TEXT\n"); while(@DATA > $MAX) { pop @DATA; } open(FILE, ">$FILE") or die("error :$!"); eval{ flock(FILE, 2) }; print FILE @DATA; close FILE; } |------改行処理他------| sub TransFormdata { $value = @_; $value =~ tr/+/ /; $value =~ s/%([0-9a-fA-F][0-9a-fA-F])/chr(hex($1))/eg; $value =~ s/&/&/g; $value =~ s/</</g; $value =~ s/>/>/g; $value =~ s/\x0D\x0A\s*/<br>/g; $value =~ s/\s+/ /; return $value; } >これを >(略) >に変更しました。 この変更が「何を意味するのか?」を、良く考えてみよう。 それが理解できなければ、どうして「上記の修正で上手く行くのか」も理解できない。
お礼
ご回答ありがとうございます
補足
まだ理解が、 できていないのですが、 とりあえず試したのですが、 書き込まれる内容が全て「1」となって返ってきます。 前回内容と違うのは 「@_;」←配列変数? 「return $value;」 ←return文 TransFormdataのサブルーチン loadFormdataこれはやってることが全然違うということで 全て削除ということで・・・? TransFormdata($form->param('text')); この部分の TransFormdata のサブルーチンで 使用するときって「&」は不要なのですか? (略)というのは、どの略でしょうか?(;_;)
お礼
そういうことだったのですね! まだ100%理解できたわけではないですが、 少し理解できた気がします ありがとうございました!