• ベストアンサー

perlの文でわからないところがあります。(2)

こんにちわwindwsです。パールの文章でわからない箇所があります。先輩の皆さま、どうか宜しくお願いします。以下に文章を書きます。 (1) BEGIN {$ENV{PATH} = "/bin/usr/bin";   delete @ENV{pw (IFS CDPATH ENV BASH_ENV)};  ●sub unindent;} 特に●のヵ所はどう考えたら良いのか解りません。サブルーチンを宣言しているのですか?サブルーチンの戻り値を呼び出しているのでしょうか? (2) <FORM ACTION="/cgi/program.cgi" METHOD="POST"> <INPUT TYPE="hidden" NAME="id" ● VALUE="e07a08c4612b0172a162386ca558c6"> ここの●の行で識別子VALUEの値は誰がどのようにして決めるのですか? 宜しくお願いします。

  • Perl
  • 回答数2
  • ありがとう数3

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

  • ベストアンサー
回答No.2

(1)  11th_styleさんの通り前方宣言ですね。 (2)  セッション管理の事でしょうか?。 >誰がどのようにして決めるのですか? この3行のHTMLプログラムを作って送り出したCGIプログラムであるPERLスクリプトが、ランダムに生成したものです。 もしかするとPERLスクリプトがJavaScriptを生成しそのJavaScriptが生成したVALUEかもしれませんが、いずれにせよセッション管理であるならば、サーバー側で生成したものでしょう。 答えになってますでしょうか。

windws
質問者

お礼

有難う御座います。gyopicyan99さんのおかげで本の前後の内容を理解出来ました。サーバーが生成してくれる関数を使うと出来てくるのですね。有難うございます。

その他の回答 (1)

回答No.1

質問内容が曖昧で答えにくいですが・・・。 (1) pwではなくqwですよね? で、●の部分は、このスクリプトの後の方でunindentというサブルーチンを定義しますよということを前もって宣言しているものです。 (2) これだけだと答えようがないです。単なる文字列ですので、CGIの中でどうにかして作ってHTMLに埋めているはずです。 「どうにかして」とは、Cookieから値を取り出しているとか、ファイルの中身を書き出しているとか、ランダムに生成しているとか、色々なことが考えられますので、さらに説明が必要であればCGIのソースを出して下さい。

windws
質問者

お礼

11th_styleさんご連絡が遅れまして済みません。本日gyopicyan99さんのおかげで解決しました。11th_styleさんにも助けて頂き感謝しています。補足はこのページを見る機会がなかったため出来ませんでしたがきちんと答えて下さろうとしたこと、有難う御座いました。

関連するQ&A

  • perlがうごきません

    <html> <head> <title>form3</title> </head> <body> <form action="form3.cgi" method="post" name="form3"> <input type="text"name="form3"> <input type="submit"value="送信"> </form> </body> </html> ::::::::::::::::::::::::::::::: #! /usr/bin/perl if($ENV{"REQUEST_METHOD"} eq "GET"){ $str=$ENV{QUERY_STRING"}; }else{ read(STDIN, $str, $ENV{"CONTENT_LENGTH"}); } $str=~ tr/+/ /; $str=~ s/%([0-9A-Fa-f][0-9A-Fa-f])/pack("c", hex($1))/eg; foreach(split(/&/, $str)){ my ($key, $value)=split(/=/, $_); $data{$key}=$value; } print "Content-type:text/html\n"; print "\n"; print "<html>\n"; print "<head><title>form3</title></head>\n"; print "<body>$data{'form3'}</body>\n"; print "</html>\n"; exit; :::::::::::::::::::::::::::::::: どうしてもうごきません。 どこかスクリプトがまちがっているのでしょうか。 パールのパスはあっています。

    • ベストアンサー
    • Perl
  • if文を使用すると表示されません。

    フォームに年月日を入力してもらい、下記のスクリプトで 入力画面を表示させようとしています。 年月日を入力するフォームにはhiddenをいれ、if文でサブルーチン &newFormを表示させようとしているのですが、うまくいきません。 <input type=hidden name=mode value="data"> if文を使用せずに、&newFormを直接呼び込むと表示するのですが・・・。 ぜひご教授願えればと思います。 よろしくお願いします。 ===================================================================== &query; # 初期設定 if($in{'mode'} eq "date"){ &newForm; } sub newForm{ print"Content-type:text/html\n\n"; print <<EOF; <html> <head> <title></title> </head> <body> <textarea name="diary" rows="30" cols="70"></textarea><br> <input type="submit" value="書き込み"> </body> </html> EOF } sub query{ $ENV{'REQUEST_METHOD'}=~ tr/a-z/A-Z/; if ( $ENV{'REQUEST_METHOD'} eq "POST" ){ read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'}); }else{ $buffer = $ENV{'QUERY_STRING'}; } @pairs = split(/&/,$buffer); foreach $pair (@pairs) { ($name, $value) = split(/=/, $pair); $value =~ tr/+/ /; $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; $in{$name} = $value; } }

    • ベストアンサー
    • CGI
  • Perl/CGIでスロットマシンを作っているのですが・・・

    Perl/CGIで簡単なスロットマシンを作成しています。 一通りスクリプトは組んだのですが、うまく動作しません。 以下が自分で作成したスクリプトです。どこが不味いのか分からないので、間違えている箇所を教えてください。お願いします。 #!/usr/bin/perl $l = 1; require '/usr/perl5/site_perl/jcode.pl'; &decode; $bet = $FORM{'bet'}; $go = $FORM{'go'}; $coin = 50; if ($FORM{'bet'} = $bet) { $coin = --$coin; $bet = ++1; } elsif ($FORM{'go'} = $go) { @item=("7","BAR","BAR","@","@","@","-","-","-","-"); $a = $item[int(rand(10))]; $b = $item[int(rand(10))]; $c = $item[int(rand(10))]; if($a==$b||$b==$c) { if ($a == 7) {$coin = $coin + $bet * 50;} elsif ($a == BAR) {$coin = $coin + $bet * 10;} elsif ($a == @) {$coin = $coin + $bet * 5;} else {$coin = $coin + $bet * 2;} } } else {$coin = 0;} print<<EOF Content-type: text/html <html> <head> <meta http-equiv="Content-type" content="text/html; charset=euc-jp"> <title>スロットマシン</title> </head> <body> <form method="GET" action="kadai2b.cgi"> <center> コインの所持枚数 ($coin) 賭けるコインの枚数 ($bet)<br> [$a] [$b] [$c]<br> <input type="hidden" name="coin" value="$coin"> <input type="submit" name="bet" value="BET"> <input type="submit" name="go" value="GO"> <input type="reset" name="quit" value="QUIT"> <center> </form> </body> </html> EOF sub decode { $ENV{'REQUEST_METHOD'} =~ tr/A-Z/a-z/; if ($ENV{'REQUEST_METHOD'} eq "post"){ read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'}); } else { $buffer = $ENV{'QUERY_STRING'}; } @pairs = split(/&/, $buffer); foreach $pair (@pairs) { ($name, $value) = split(/=/, $pair); $value =~ tr/+/ /; $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; &jcode::convert(*value, 'euc'); $FORM{$name} = $value; } }

    • ベストアンサー
    • CGI
  • requireでreturnを使いたいのですが・・・

    お世話になります。 sub a{ if (-e "./a.cgi"){ repuire "./a,cgi"; } ... } としてa.cgiのなかにreturn関数を入れ、もしa.cgiが存在するならサブルーチンを終了させたいのですがdid not return a true value atエラーが出ました。 戻り値を1としたらエラーは消えましたが...の部分が実行されました。 どなたか解決方法お分かりになる方いましたらご教示お願い致します。

    • ベストアンサー
    • Perl
  • Perl/JavaScript/サブルーチン

    はじめまして。 今ちょっといじってるプログラムについてお聞きしたいことがあります。 index.htmlのtextareaからmy.cgiを呼び出したい のですが。my.cgiというのは 1.textareaに入力された文章をデータベースに保存。 2.日付順にソートし新しいものを一つだけ取り出す。 3.index.htmlに表示する というものなのですが。 デフォルトでtextareaに一番新しい情報が入るようにしたいのです。valueで指示したのですがJavaScriptが邪魔してブラウザに反映されません。ソースを見るとvalue="********"とはいっています。 my.cgiを呼び出す命令を記述したmy.jsというファイルを作ってサブルーチンのように扱うという方法も考えているのですが、呼び出しやindex.htmlに表示させる記述の仕方が分かりません。 どなたか分かる方は、どうぞ宜しくお願いいたします。

  • CGI間のデータ送信について(perl)

    perlのcgiで詰まってしまったので質問します。 現在困っていることは、cgiからcgiへの変数の値の受け渡しについてです。 色々調べてやってみたのですが、うまくいきません。 送信側で print "<form action = \"sendmail.cgi\" method=\"post\">"; print "<A href =\"sendmail.cgi?$array1[0]&$array1[1]&$array1[2]&$array1[3]\">sendmail.cgi</A>"; print "<input type=\"submit\" value=\" ボタンです。 \">"; print "</form>"; として 受信側で # postでもgetでも受信できるようにする if ($ENV{'REQUEST_METHOD'} eq "GET") { $data = '1'; $testmsg = "GETで受信"; $formdata = $ENV{'QUERY_STRING'}; print("$formdata<BR>"); } elsif ($ENV{'REQUEST_METHOD'} eq "POST"){ # こちらを使用している $data = '2'; $testmsg = "POSTで受信"; $length = $ENV{'CONTENT_LENGTH'}; read(STDIN,$formdata,$ENV{'CONTENT_LENGTH'});# $dataに受信する print("$formdata<BR>"); } else { $data = '3'; $testmsg = "受信することができませんでした。<BR>"; } としてpostにて受信しようとしています。 postのif文には入ったようなのですが、データが空っぽで何も入っていないようなのです。 何が原因なのでしょうか?助けてほしいです。

    • 締切済み
    • CGI
  • 標準入力からデータが読込めない

    現在perlにてcgiを作成しています。 以下のようなcgiを作成したのですが、POSTで受取ったデータが 標準入力より取得できません。 解決策、又は、調査方法等ご存知の方いらっしゃいましたら教えてください。 --------- a.cgi -------- #!/usr/bin/perl print "Content-type: text/html\n\n"; if( $ENV{'REQUEST_METHOD'} eq "POST" ){ read( STDIN, $buffer, $ENV{'CONTENT_LENGTH'} ); }else{ $buffer = $ENV{'QUERY_STRING' }; } print <<"HTML"; <HTML><HEAD><TITLE>テスト</TITLE> <META http-equiv=Content-Type content="text/html;"> </HEAD> <BODY> <FORM id=Form1 name=Form1 action=a.cgi method=post> HTML print <<"HTML"; <INPUT type=hidden value=aaa name=text1> <INPUT onclick="return confirm('送信します。よろしいですか?');" type=submit value=送信 name=Button1> </FORM> </BODY> </HTML> HTML exit; -------------------------------------------------- $ENV{'REQUEST_METHOD'} は POST を取得できていますし、 $ENV{'CONTENT_LENGTH'} も文字数は取得できています。 どうか宜しくお願い致します。

    • ベストアンサー
    • Perl
  • PERL sendmailセキュリティ対策について

    cgiを直接呼び出して、メールを送信されてしまうエラーについて質問させてください。 以下のように、sendmailを利用するサブルーチンを呼び出しています。 if ($query->param('confirm')) { #←初期値は""で一番下のelseに飛ぶ # input data check my @err_lst = (); #←入力チェックしてエラーメッセージを蓄積 if (&InputCheck($query, \@err_lst)) {#←入力内容をチェック # ok &NextPage($query); #←確認画面を表示 } else { # error &SamePage($query); #入力内容にエラーがある場合、入力画面に戻す } } elsif ($query->param('send') eq "送信") { # send mail & make log &SendMail($query); #メール送信用サブルーチン } else { # make init form &InitPage($query); #CGI起動直後はこのサブルーチンから入力フォームを表示 } この書き方ですと、 <input type="hidden" name="confirm" value=""> <input type="hidden" name="send" value="送信"> で、直接「&SendMail($query);」が起動してメール送信されてしまいます。 メール本文やアドレスの文字エスケープ処理は動いているのですが、 sendmailを呼び出す前には、必ず入力内容をチェックするサブルーチンを通る事を 強制する方法はないでしょうか。 当方、この修正の為にこの2週間突貫でPERLを独学している素人の為、 上記事例について読んでおくべき参考書などがあれば、お教えいただけますと とてもとても助かります。 どうぞよろしくお願いいたします。

    • ベストアンサー
    • Perl
  • perlについて、教えてください。

    perlについて、教えてください。 「apple.html」と「bigin.html」に、それぞれ, textboxが一つあり、入力値をkeep.cgiで受取り、 「keep.txt」に書込もうと考えています。 a.htmlのテキストボックスに、入力して、submitボタンをクリック しても、「keep.txt」に何も書き込まれません。 「keep.txt」に、 _______ a=100 b=200 ________ のように、書込みたいと考えています。 下記、keep.cgiのどこが間違っているのか、教えてください。 ___以下、「keep.cgi」です。_______________________________ #! c:/perl/bin/perl if($ENV{'REQUEST_METHOD'} eq 'POST') { read(STDIN, $query, $ENV{'CONTENT_LENGTH'}); } else { $query = $ENV{'QUERY_STRING'}; } #$queryに「●_text=●」が入っている。 #ファイルを開く、読み書き用。 $open_file_name = "+<keep.txt"; open(A,$open_file_name); #開いたファイルを、1行ずつ読み込む。 while(<A>){ #$_には、keep.txtの、1行目が入っている。 #$_(読込んだ行)に「●_text」があるか、チェックする if($_ =~ /$query/){ #あった場合 next; } #読込んだ行に、$query以外なら、配列に。 @keep = $_; @keep = $query } #ファイルを閉じる。 close(A); #ファイルを削除する unlink($open_file_name); #削除したのと、同じファイル名で新規作成 $new_file = ">>keep.txt"; open(A,$new_file); #再度、作成したファイルに、配列@keepを書込む。 print A @keep; #ファイルを閉じる close(A); print "Cotent-type:text/html\pirnt n\n"; print <<EOF; <body bgcolor="pink"> <font size="4"> 入力値をファイルに書込みました。<br> </font> EOF exit; ______________________ 宜しくお願いします。

    • ベストアンサー
    • CGI
  • perlの文法について

    はじめましてstaraman_sです。 今はPerl/CGI辞典という本を使いながらPerlの勉強をしていますが、インターネットで検索しても解決できず困っています。 皆さんのお力をお貸しください。 疑問点 sub getCookie { my ($tmp, $name, $value); for $tmp (split(/; */, $ENV{'HTTP_COOKIE'})) { ($name, $value) = split(/=/, $tmp); $value =~ s/\%([0-9a-fA-F][0-9a-fA-F])/pack("C", hex($1))/eg; $COOKIE{$name} = $value; } } 本の中の掲示板のプログラムの中に上記のようなプログラムが書いてあるのですが、最後の方に$COOKIE{$name} = $value;とあります。変数$COOKIEの後に中括弧を使い{$name}と書いているのは、どういった文法からきているのでしょうか。 よろしくお願いいたします。

    • ベストアンサー
    • CGI

専門家に質問してみよう