プロが教えるわが家の防犯対策術!

このようなチェックボックスを作って
<INPUT type="checkbox" name="q1" value="A">A<br>
<INPUT type="checkbox" name="q1" value="B">B<br>
<INPUT type="checkbox" name="q1" value="C">C<br>

このようなPerlの記述をして
use CGI;
$q = new CGI;
@q1 = $q->param('q1');

このようなCGIの値の書き出し部分はどうしたらいいですか?
print "<td width=300><font size=2>●●{'q2'}</font></td>\n";

上記の
@q1 = $q->param('q1');
に、チェックされた値が格納されているんですよね。
その値を表示させたいと思っています。
いろいろ教えてもらって、ここまでたどり着きました。

A 回答 (4件)

#3さんの『お礼』にあるコードですが、間違っているところだけ書いておきます。



原因はCGI.pmと独自の入力処理が、それぞれデータをとり合っていることです。このコード上では、独自の入力処理の部分がSTDINを読み込んでしまうので、CGI.pmからは何も読む事は出来ません。

入力処理には、CGI.pmか独自入力処理の『いずれか』を用いてください。全て書いても使えるのは一つだけです。質問内容から考えられるお勧めは、CGI.pmを利用する事です。(オーバースペックですが、ひとまずそう言うことは考えない方針で。)

コードを見る限り、恐らく『データでコード処理』の部分を全て削除すれば大丈夫だと思います。
    • good
    • 0
この回答へのお礼

hikominさんのおっしゃる通りにしましたら、上手くいきました!!今、ものすごく興奮しています。この作業を始めてから2週間、毎日本を探しに行ったり、人に聞いたり、こちらでお世話になったりと・・・。PerlもCGIも初心者の私には荷が重い作業でしたが、こうやって達成できるとなんとも言えない充実感があります。お陰で期日までに間に合いそうです。それもこれも、今までアドバイスをしてくださった皆さんのお陰で、この場をかりて感謝の気持ちを述べさせていただきます。本当にありがとうございました。

お礼日時:2005/03/09 10:04

配列になっているので、他の方の回答のように一般的にはループさせて内容を書き出します。


まぁ、一箇所に繋げてABCとかそのまんま書き出すだけでいいなら
print "<td width=300><font size=2>@q1</font></td>\n";
でも書き出してくれるけど。


せめて(A,B,C みたいに)カンマで区切るとかしたほうが見易いかも。
$q1_str = join ',',@q1;
print "<td width=300><font size=2>$q1_str</font></td>\n";
    • good
    • 0
この回答へのお礼

本にもそういう風に書いてありましたが上手くいきません。以下は他人の見本を私が改造して作りましたが何かおかしいですか?余計な記述、意味不明記述もなあるかもしれません
#!/usr/local/bin/perl

# 日本語コード
require 'jcode.pl';

# データデコード処理
if ($ENV{'REQUEST_METHOD'} eq 'POST')
{
read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
  @pairs = split(/&/, $buffer);
}
foreach $pair (@pairs)
{
($name, $value) = split(/=/, $pair);
$name =~ tr/+/ /;
$name =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
$value =~ tr/+/ /;
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
$value =~ s/<!--(.|\n)*-->//g;
}

# 配列
use CGI qw(:standard);
@q1=param("q1");
$q1_str = join ',',@q1;


# 確認の画面

print "Content-type: text/html\n\n";
print "<meta http-equiv=\"Content-Type\" content=\"text/html; charset=shift_jis\">\n\n";
print "<html>\n <head>\n";
print " <title>テスト</title>\n";
print " </head>\n <body>\n";
print " <form method=post action=\"aaa.cgi\">\n";
print " <table border=1 cellspacing=2>\n";
print " <tr>\n";
print " <td width=100><font size=2>質問1</font></td>\n";
print "   <td width=300><font size=2>$q1_str</font>&nbsp;</td>\n";
print " </tr>\n";
print " </table>\n";
print " </center>\n";
print "<input type=\"submit\" value=\"送信\"><input type=\"button\" value=\"戻る\" onClick=\"history.back()\"><br><br>";
print " </body>\n";
print " </form>\n";

# エラー処理
sub error
{
($error,@error_fields) = @_;

if ($error eq 'missing_fields')
{
}
exit;
}

お礼日時:2005/03/08 19:02

foreach my $value (@q1){


print "<td width=\"300\"><font size=\"2\">$value</font></td>\n";
}

省略できるところを省略すると、

foreach (@q1){
print qq|<td width="300"><font size="2">$_</font></td>\n|;
}

forを使った書き方をしてみると、

for($i=0; $#q1>=$i; $i++){
print qq|<td width="300"><font size="2">$q1[$i]</font></td>\n|;
}
    • good
    • 0
この回答へのお礼

print "<td width=300><font size=2>●●</font>&nbsp;</td>\n";

とあって「●●」に
foreach (@q1){
print qq|<td width="300"><font size="2">$_</font>&nbsp;</td>\n|;
}
と入れるのですか?
そうじゃないことは分かっています・・・。

@q1 = $q->param('q1');
で取った値を取り出したいのですが、
foreach my $value (@q1){ print $value;
}
で取り出せるけど、「確認画面」というものに自分がチェックしたものを表示させてあげるのは無理なのでしょうか?
そういうことで
print "~\n";
を使っています。

お礼日時:2005/03/08 16:43

おっしゃる通り、@q1にチェックされた値が格納されています。


全部出すなら

foreach my $value (@q1){ # @q1から一つずつ取り出して$valueに入れるループ
print $value;
}

とかとかです。(整形はご自分で。)

いろいろ省略する事も出来ますが、うっかり省略しすぎると最初は分けが分からなくなりますので、ひとまず上の形で使ってみてください。
    • good
    • 0
この回答へのお礼

すいません間違えてました。「●●{'q2'}」を「●●」にしてください。
ところで「●●」には
foreach my $value (@q1){ # @q1から一つずつ取り出して$valueに入れるループprint $value;}
と全て入れるのですか?

お礼日時:2005/03/08 14:11

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!