-PR-
解決
済み

Perl BBS 掲示板 改行処理

  • 困ってます
  • 質問No.9294857
  • 閲覧数130
  • ありがとう数2
  • 気になる数0
  • 回答数2
  • コメント数0

お礼率 60% (3/5)

改行処理について教えてください。

今まで書き込み処理で
unshift @DATA, "$tm,$FORM{'name'},$FORM{'title'},$FORM{'text'}\n";
としていたのですが、これを
use CGI;
my $form = new CGI;
my $NAME = $form->param('name');
my $TITLE = $form->param('title');
my $TEXT = $form->param('text');
unshift(@DATA,"$tm,$NAME,$TITLE,$TEXT\n");
に変更しました。

すると
sub loadFormdata
が聞かなくなり、
改行処理他が対応しなくなってしまいました、
この場合、 loadFormdataの部分のどこを変えればよいでしょうか?

|------書き込み処理------|

sub printdata{
use CGI;
my $form = new CGI;
&loadFormdata();
open(FILE, "<$FILE");
eval{ flock(FILE, 1) };
@DATA = <FILE>;
close FILE;
my $tm = time;
my $NAME = $form->param('name');
my $TITLE = $form->param('title');
my $TEXT = $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 loadFormdata
{
my ($query, $pair);
if($ENV{'REQUEST_METHOD'} eq 'POST') {
read(STDIN, $query, $ENV{'CONTENT_LENGTH'});
}
else {
$query = $ENV{'QUERY_STRING'};
}
foreach $pair (split(/&/, $query)) {
my $key = ("$NAME,$TITLE,$TEXT");
my ($key, $value) = split(/=/, $pair);
$value =~ tr/+/ /;
$value =~ s/%([0-9a-fA-F][0-9a-fA-F])/chr(hex($1))/eg;
$value =~ s/&/&amp;/g;
$value =~ s/</&lt;/g;
$value =~ s/>/&gt;/g;
$value =~ s/\x0D\x0A\s*/<br>/g;
$value =~ s/\s+/ /;
$FORM{$key} = $value;
}
}
通報する
  • 回答数2
  • 気になる
    質問をブックマークします。
    マイページでまとめて確認できます。

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

  • 回答No.2
レベル14

ベストアンサー率 43% (6850/15867)

コンピューター カテゴリマスター
>書き込まれる内容が全て「1」となって返ってきます。

失礼。うっかりミスです。

sub TransFormdata
{
$value = @_;

の部分を

sub TransFormdata
{
my $value;
($value) = @_;

に修正して下さい。

「($value) = @_;」だと「引数に渡されて来たデータを$valueに代入」になるのですが、括弧で括るのを忘れて「$value = @_;」にしてしまいました。「$value = @_;」だと「引数の個数を$valueに代入」になってしまいます。

つまり「1」がリターンされてしまいます。
お礼コメント
Serial29181

お礼率 60% (3/5)

そういうことだったのですね!

まだ100%理解できたわけではないですが、
少し理解できた気がします

ありがとうございました!
投稿日時 - 2017-02-20 10:21:53
関連するQ&A
-PR-
-PR-

その他の回答 (全1件)

  • 回答No.1
レベル14

ベストアンサー率 43% (6850/15867)

コンピューター カテゴリマスター
>この場合、 loadFormdataの部分のどこを変えればよいでしょうか? どこをどう変えても直らない。 loadFormdataは、CGI.pmを完璧に無視して、独自に取り出したデータを加工して「$FORM{$key}」に返している。 一方、書き込み処理は my $form = new CGI; my $NAME = $form->param('name'); my ...続きを読む
>この場合、 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/&/&amp;/g;
$value =~ s/</&lt;/g;
$value =~ s/>/&gt;/g;
$value =~ s/\x0D\x0A\s*/<br>/g;
$value =~ s/\s+/ /;
return $value;
}

>これを
>(略)
>に変更しました。

この変更が「何を意味するのか?」を、良く考えてみよう。

それが理解できなければ、どうして「上記の修正で上手く行くのか」も理解できない。
補足コメント
Serial29181

お礼率 60% (3/5)

まだ理解が、
できていないのですが、
とりあえず試したのですが、

書き込まれる内容が全て「1」となって返ってきます。

前回内容と違うのは
「@_;」←配列変数?
「return $value;」 ←return文
TransFormdataのサブルーチン

loadFormdataこれはやってることが全然違うということで
全て削除ということで・・・?

TransFormdata($form->param('text'));
この部分の TransFormdata のサブルーチンで
使用するときって「&」は不要なのですか?

(略)というのは、どの略でしょうか?(;_;)
投稿日時 - 2017-02-17 13:54:19
お礼コメント
Serial29181

お礼率 60% (3/5)

ご回答ありがとうございます
投稿日時 - 2017-02-17 14:13:10


このQ&Aで解決しましたか?
関連するQ&A
-PR-
-PR-
こんな書き方もあるよ!この情報は知ってる?あなたの知識を教えて!
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。

その他の関連するQ&A、テーマをキーワードで探す

キーワードでQ&A、テーマを検索する
-PR-
-PR-
-PR-

特集


いま みんなが気になるQ&A

関連するQ&A

-PR-

ピックアップ

-PR-
ページ先頭へ