現在perlを使ってCGIに挑戦しています。
アンケート用紙のようなフォームを作りそこに
文字を入力してもうらうプログラムを作成しています。
そこで質問なのですが、アンケート用紙のような物に文字を入力してもらってオーケーボタン
を押した時に、必ず入力してもらいたい所の入力漏れ注意や数字を入れてもらう所をかな入力で入れている人に注意をうながすようなサンプルを探していますがなかなか見つかりません。
どうかそのような本、ホームページ等、又それに関する資料等ありましたらどうかおしえていただけませんでしょうか?
どうかよろしくお願いします。

このQ&Aに関連する最新のQ&A

A 回答 (4件)

deiaっす。


とりあえずは下記のようなものでいかがでしょう?
項目は名前とメールアドレスだけなのでお好みに合わせていじくりまくりましょう。(^_^)!!
あとform actionの指定忘れずに。
それではがんばってください。

<html>
<head>
<title>フォーム</title>
<SCRIPT LANGUAGE="JavaScript">
<!---


function Check(){
if (document.forma.name.value==""){
window.alert("名前が記入されていません。");
return false
}
if (document.forma.mail.value==""){
window.alert("メールアドレスを入力してください。");
return false ;
}
else if(document.forma.mail.value.indexOf("@",0)<=0){
window.alert("メールアドレスが間違っています。");
return false;}
return confirm("以下の内容で送信します。 \n\n名前:"+document.forma.name.value+"\nメールアドレス:"+document.forma.name.value+"\n\nよろしいですか?");
return true;}


//--->
</SCRIPT>
</head>
<body>

<form name="forma" method="post" action="" onSubmit="return Check()">
名前:<input type="text" size="40" name="name"><br>
メールアドレス:<input type="text" size="40" name="mail"><br>
<input type="submit" value="送る">
<input type ="reset" value="リセット">
</form>
</body>
</html>
    • good
    • 0

再びdeiaです。



>本の情報ですが、ジャバを使うとエラーメッセージが出せるもののそれを無視して通過する事ができると書いてあったのでCGIで作るしかないのかなと思ったのです。

どの本の情報か知りませんが、JavaScriptでもエラーメッセージを無視して通過するなどと言うことは全く無いと思います。(作り方にもよるかもしれないけど、そんな変な作り方する人いないと思うし。)
何かあればまた補足に追加してください。では!!!
    • good
    • 0
この回答へのお礼

それであればジャバで作ったほうが良いと思います。
deiaさんがお勧めするジャバソースをしていましたらおしえていただけませんでしょうか?

どうぞよろしくお願い致します。

お礼日時:2001/07/19 10:26

JavaScriptの方が簡単ですが、Perlでということであれば以下の方法でどうでしょうか。



まずHTML側ですが、
フォームの入力部分は
<INPUT TYPE="text" NAME="お名前">
<INPUT TYPE="text" NAME="電話番号">
<INPUT TYPE="text" NAME="住所">
といった感じで記述されているとします。

入力必須にしたい項目を
<INPUT TYPE="hidden" NAME="required" VALUE="お名前:住所">
のようにTYPE="hidden"、NAME="required"、VALUE="必須にしたい項目名:必須にしたい項目名(…以下同じ)"
としてあげます。

次にPerlですが、
おそらく読み取ったデータを配列にセットされていると思いますので上記hiddenで渡されたNAME="required"の部分を@requiredにセットする別処理を加えてあげます。

@pairs = split(/&/,$buffer);
foreach $pair (@pairs) {
($name,$value) = split(/=/,$pair);
if ($name eq "required") { @required = split(/:/,$value); }
else { push(@data_name,$name); push(@data_value,$value); }
}
なお、上の処理は日本語等の処理の部分は省いてあります。

その下で以下のようにチェック処理をしてあげればOKです。
$count = @data_name;
foreach $required (@required) {
foreach (0..$count-1) {
if ($data_name[($_)] eq $required && $data_value[($_)] eq "") { ※エラー時の処理;}
}
}

あまりスマートなやり方ではありませんが、一応動きます。
参考になれば幸いです。
    • good
    • 0

CGIじゃなくてもJavascriptを使った方が手軽で簡単に出来ると思います。


がperlでという事なので定番のこちらのサイトで自分なりに勉強してみては・・・。
正規表現などが理解できていれば、perlでも簡単に出来ると思います。
ではがんばってください。

参考URL:http://tohoho.wakusei.ne.jp/www.htm
    • good
    • 0
この回答へのお礼

回答頂き本当に助かります。
本の情報ですが、ジャバを使うとエラーメッセージが出せるもののそれを無視して通過する事ができると書いてあったのでCGIで作るしかないのかなと思ったのです。

そこらへんは作り方によって大丈夫になるのでしょうか?

お礼日時:2001/07/19 08:35

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

このQ&Aと関連する良く見られている質問

Qperl-cgiで1文字や2文字など短い、文字コードを正しく変換したい

一文字や、2文字の短い文字コードを正しく変換したいのですが何か、良い方法は無いでしょうか?
文字コードには、絶対に、SJISかUTF8のどちらかしか使っていません。
どなたか、お分かりになる方、教えていただけないでしょうか?
よろしくおねがいいたします。

Aベストアンサー

何文字であっても Encode の from_to を使えばいいと思います。



use Encode 'from_to'; # プログラムの最初の方でこれをやっておく。

# 実際に使いたい所でこれをする(この場合はShift_JISからutf8への変換)。
from_to($str, 'Shift_JIS', 'utf8');
# この後は $str の内容がutf8になっている。

Qサンプルの意味

お世話になります。
あるサイトで下記のようなサンプルをみつけました。

-------------------------------------------------------------
use SOAP::Lite;
use MIME::Entity;
my $soap = SOAP::Lite
->uri($NS)
->proxy($HOST);
my $som = $soap->foo();
★foreach my $part (${$som->parts}) {
★ print $part->stringify;
}
-------------------------------------------------------------

実際に動かしてみたのですが"Not a SCALAR reference"エラーで動きません。
実のところあまり意味がわかっていなかったので、どのような動きかを調べてみましたが、★のところがわかりませんでした。

★の部分などは、perlの一般的な書き方だと思っていたのですが、調べた限り意味がわかりません。
これはどういう意味なのでしょうか?ご教授いただけたらと思います。

$som->partsをprintすると、"ARRAY(0xxxxx)"が出力されます。
普通の配列を出力してもARRAY(0xxxx)とは出力されませんよね?これはどういう意味なんだろう・・・

お世話になります。
あるサイトで下記のようなサンプルをみつけました。

-------------------------------------------------------------
use SOAP::Lite;
use MIME::Entity;
my $soap = SOAP::Lite
->uri($NS)
->proxy($HOST);
my $som = $soap->foo();
★foreach my $part (${$som->parts}) {
★ print $part->stringify;
}
-------------------------------------------------------------

実際に動かしてみたのですが"Not a SCALAR reference"エラーで動きません。
実の...続きを読む

Aベストアンサー

> $som->partsをprintすると、"ARRAY(0xxxxx)"が出力されます。
> 普通の配列を出力してもARRAY(0xxxx)とは出力されませんよね?これはどういう意味なんだろう・・・

これは、$som->parts が配列のリファレンスであることを示しています。
Cがわかるならポインタのようなもんだと思ってください。

最近のPerlプログラミングにおいてはリファレンスは
非常に重要な概念ですので、よく調べておくことをお奨めします。

とりあえず
perldoc perlref
で入門レベルの知識は得られます。
#探せば日本語訳もあるでしょう

んで、
>実際に動かしてみたのですが"Not a SCALAR reference"エラーで動きません。

このエラーは

> ★foreach my $part (${$som->parts}) {

ここで出てませんでしたか?
最初に書いたとおり、$som->parts は配列のリファレンスなのに、
スカラーのリファレンスとして解決しようとしているので、

> "Not a SCALAR reference"
「スカラーのリファレンスじゃないわ、ボケっ」
と文句たれてるわけです。
そもそも、for ループの処理対象なので、スカラーがここに置かれるのは
おかしいですね。
写し間違いとかありませんか?

たぶん、@{$som->parts} が正しいと思うんですが。

> ★ print $part->stringify;

こっちはたぶんSOAP使って呼び出したところの
仕様によるんで断言できませんけど、
名前からするとクラスを文字列化してるんじゃないですかね。
要はわかりやすいであろう形式にするメソッドだと思います。

あと、本なら初めてのPerlあたりを読んどくといいんじゃないでしょうか。
日本人の筆者が書いた書籍ではリファレンスを
きちんと説明した本はなかったと思います。

> $som->partsをprintすると、"ARRAY(0xxxxx)"が出力されます。
> 普通の配列を出力してもARRAY(0xxxx)とは出力されませんよね?これはどういう意味なんだろう・・・

これは、$som->parts が配列のリファレンスであることを示しています。
Cがわかるならポインタのようなもんだと思ってください。

最近のPerlプログラミングにおいてはリファレンスは
非常に重要な概念ですので、よく調べておくことをお奨めします。

とりあえず
perldoc perlref
で入門レベルの知識は得られます。
#探せば日本語訳...続きを読む

Qログに記録又は読み出す際、最新の100件以外の扱いについて

お世話になります。

perlでログを記録する際に、最新の100件だけを常に表示又は記録しようと思考しているのですが、記録部分で常に最新の100件だけを記録するようにするのか、
読み出す際に最新の100件を読み出し、その際、100行以上ある場合、最新の100件に更新するように処理するのか、どちらが良い処理方法なのでしょうか。

※dataの書き込み/書き込みは下記のような処理を行なっています。
(現在100件の書き込み読み出しを行なう際の処理を考えるに際し、関数などを調べている最中なのですが、処理方法などご教授頂けますと幸いです)
■data追加部分
if ($a eq 'abc'){
open(OUT,">>./test.log");
print OUT "$var\n";
}
close(OUT);

■読み出し部分
$logfile = './test.log';
open(IN,"$logfile");
while(<IN>){
print "$_";
}
close(IN);

Aベストアンサー

最新100件に保つ方がいいでしょう。
いらない100件を超える古い分を記録していても(使わないのなら)記録しておく意味がありません。
$max = 100; #最大数
open(FH, "+< ./test.log") || die "Can't Open : $!";
@list = <FH>; #既存のデータを読む
push(@list,"$var\n"); #新しいのを追加
shift(@list) if($#list + 1 > $max); #最大数を超えたら先頭から1つ除去
truncate(FH,0); #ファイルサイズを0にする
seek(FH,0,0); #ポインタを先頭に戻す
print FH @list; #書き込む
close(FH);

QWWW::Mechanizeを使っておられる方、又は使える方に質問です。

WWW::Mechanizeを使っている方、使える方にお聞きしたいです。
下記のような適当なURLを読みこんでそのリンクを辿るコードを書きました。
リンクが見つからなかった場合のチェックが正常に働くかの確認ため、
15行目でわざと存在しないlinkを指定してみました。
16行目で止まって欲しいのですが、止まりません。最終行の様にすると止まります。
この振舞いは私だけでしょうか?

もしお手持ちの環境でMechanizeが使える方、試せる方がおられましたら
結果を教えて頂けたら幸です。

1つ気になっているのは、installのmeke testの段階で、
以下に関しエラーが出てはおりました。
t/live/follow.t
t/live/follow_link.t
t/live/get.t
t/local/back.t

私の環境は
RHL9,
perl, v5.8.0
gcc 3.2.2
です。

#!/usr/bin/perl -w

use strict;
use WWW::Mechanize;
use LWP 5.803;

my $url="http://www.yahoo.co.jp";

my $mec=WWW::Mechanize->new();

my $response=$mec->get($url);
$mec->success() or die $mec->res->status_line();
# $urlが存在しない場合はここで止まって欲しいし実際とまることを確認。

my $a=$mec->follow_link(url_regex => qr/bad_html$/); #存在しないリンクを指定
$mec->success() or die $mec->res->status_line();
#ここで止まることを期待するが止まらない。

#$a or die "Failed to find links\n"; #こうすれば止まる。

WWW::Mechanizeを使っている方、使える方にお聞きしたいです。
下記のような適当なURLを読みこんでそのリンクを辿るコードを書きました。
リンクが見つからなかった場合のチェックが正常に働くかの確認ため、
15行目でわざと存在しないlinkを指定してみました。
16行目で止まって欲しいのですが、止まりません。最終行の様にすると止まります。
この振舞いは私だけでしょうか?

もしお手持ちの環境でMechanizeが使える方、試せる方がおられましたら
結果を教えて頂けたら幸です。

1つ気になっているの...続きを読む

Aベストアンサー

$mech->successは
>最後のリクエストが成功したか否かをtrue(1)かfalse(0)で返します。
とのことなので、
$mech->follow_linkで、そのページにリンクが見つからなければ、
(新たなリクエストは行われないので)
最後のリクエストは、www.yahoo.co.jpへのリクエスト、
ゆえに1が返ってくる。

Q1文字を複数の文字に変換したいです。

print で書き出したHTMLのページの下に、そのページのソースを表示
しようと思っています。

$source .= "<html><head><title><title></head><body>\n";
$source .= "ソースを表示</body></html>\n";
print "$source\n";
#--------------------------
$source =~ tr/</&lt;/;
$source =~ tr/>/&gt;/;
#--------------------------
print "<br><div style=\"overflow:auto; width:550px; height:300px\">
$source
</div>\n";

あたり前ですが、これだと「<」「>」は「&」になってしまいます。
「<」を「&lt;」に「>」を「&gt;」に変更する方法を教えて頂きたくお願い致します。

Aベストアンサー

s///g を使わないのはなぜ?


おすすめ情報