• 締切済み

STDINについて

perl初心者です。よろしくお願いします。 <INPUT TYPE="password" NAME="pass" SIZE=12 MAXLENGTH=12> <INPUT TYPE="submit" VALUE="入室"> で入力されたパスワード(1234)を read(STDIN, $pass, $ENV{'CONTENT_LENGTH'}); print $pass;とすると、status=send&pass=1234とかえってきます。 これについて、$passの内容を1234にするには、 $pass=………;とするのでしょうが、この………部分の記述を どうすればよいのかわかりません。left関数は拒否されました。

  • Perl
  • 回答数1
  • ありがとう数1

みんなの回答

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.1

参考URLが参考になるかも

参考URL:
http://okweb.jp/kotaeru.php3?qid=1206111
igosotaro
質問者

お礼

ありがとうございました。ご回答がヒントになり、他の質問を しらみつぶしに読んでいきましたところ、 $pass = substr($pass,17,$len);に出会いました。 問題は解決しました。

igosotaro
質問者

補足

どうも私には難しすぎるようです。このデコードというのをそのまま コピーすればよいのでしょうか?フォームメソッドはPOSTでなく ても、1234が返ってきさえすれば問題ないのですが。 $len = $ENV{'CONTENT_LENGTH'}; $len = $len - 17; $pass = right($pass,$len); print $pass; とやってみたら、 …&mode::right…というようなエラーメッセージがでました。

関連するQ&A

  • STDINから何度も読み込むことはできますか?

    Perlはかじっている程度の者です。 STDINから全てのデータを read( STDIN, $strRead, $ENV{CONTENT_LENGTH} ); として読み込んで、次に read( STDIN, $strRead, $ENV{CONTENT_LENGTH} ); とすると、もう読み込めませんよね。 なので、 seek( STDIN, 0, 0 ); を毎回呼び出して、ポントを先頭にもっていってから読もうとしたのですが・・だめでした。 そこで質問なのですが、CGIプログラムでSTDINから何度も重複してデータを読み込む方法はありませんか?

    • ベストアンサー
    • Perl
  • cgiでのデータ受信

    すみません、これで最後にします・・・ http://okwave.jp/qa/q7445617.html 結局getによるデータ受信の方もできませんでした。 やはりPOSTに戻ってやってみると、$ENV{'CONTENT_LENGTH'}の値は入っています。 文字の長さが入っているということは、文字列が入っているだろうということなので、 後は文字を読み込むだけのはずです。 となると read(STDIN, $alldata, $ENV{'CONTENT_LENGTH'}); このコードが間違っているのでしょうか?

    • ベストアンサー
    • 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
  • CGIファイル1つで掲示板

    1つだけのファイルで一覧型の掲示板を作っています。 HTMLを表示するのもそれです。 フォームで送信すると、自分のファイル自身にアクセスします。 $ENV{'CONTENT_LENGTH'}は受け取ることができたけど read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'}); では$bufferは空っぽでした。 1つのファイルでPOSTデータの送受信をするのは requireを使わないと無理ですか?

    • ベストアンサー
    • CGI
  • とほほさんのファイルのアップロードのことで

    http://tohoho.wakusei.ne.jp/wwwxx034.htm のファイルのアップローダーを使用しています。 私は普段postのデータを受け取るのに、 read(STDIN,$buffer,$ENV{'content_length'}); のように指定していますが、ここでは $buf = ""; $read_data = ""; $remain = $ENV{'CONTENT_LENGTH'}; binmode(STDIN); while ($remain) { $remain -= sysread(STDIN, $buf, $remain); $read_data .= $buf; } としているみたいです。 ファイルをアップロードするだけなら上記をそのまま使用すればいいのですが、 ファイル名とともに取得したいデータをファイルアップロードの画面でユーザーに指定してもらうので、 そのデータをどのように取得すればいいのかわかりません。 このとほほさんが書いたコードはどのようにデータを受信しているのでしょうか? おわかりの方ご説明お願いします。

    • ベストアンサー
    • Perl
  • アップローダがうまく作れない

    アップローダを作成しています。 しかしなぜか受け取る側の.plでファイルが見つからず、開けません。 HTMLと.plのソース付けときますので間違えの指摘お願いします <table border="0"> <form action="./UpShori.pl" method="post"> <tr><th><Div Align="right">アップするファイル</th><th><Div Align="left"><input type="file" name="file" size="39"></th></tr> <tr><th><Div Align="right">ファイルの説明</th><th><Div Align="left"><input type="text" name="setumei" size="50" maxlength="45"></th></tr> </table><br> <input type="submit" value="アップロード"> --受け取るUpShori.pl--- #!c:/Perl/bin/Perl.exe print"Content-type: text/html\n\n"; $Data; @DataBunkai; $UpFileName; @UpFileData; read(STDIN,$Data,$ENV{'CONTENT_LENGTH'}); @DataBunkai = split("=","$Data"); @DataBunkai = split("&","$DataBunkai[1]"); $UpFileName=$DataBunkai[0]; # ここで”ファイルがありません”と出力される open(READ,"<","$UpFileName") or die print"ファイルがありません"; @UpFileData=<READ>; close(READ); # ↓の生成されるファイル名は気にせずお願いします。 open(WRITE,">","0000"); print WRITE"@UpFileData"; close(WRITE); print<<End_Of_Program; End_Of_Program

    • ベストアンサー
    • Perl
  • 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
  • submitボタンが押せない? J-skyにて

    J-sky向けにサイトを運営しているものです。 最近のパケット対応した機種から、「submitボタンが押せない」という クレームが来ています。 何かご存じの方、教えて下さい。 ----ソースはこんな感じです。 <form action=../cgi-bin/xxx.cgi method=post> ID<input type=text name=id size=10 maxlength=25> Pass<input type=password name=pass size=10> <input type=submit name=act value=login></form> 昔のパケット非対応の機種からは問題なくクリックできます。 よろしくお願いします。

    • ベストアンサー
    • CGI
  • コーディングについて

    http://www.aimix.jp/cgi/accformkioku.html 上のサイトを参考にログイン画面を作っていまして、 この例の場合のようにセレクトする値が3つ、4つならこの書き方でもよいと思うのですが、 セレクトする値が10個、15個…となればソースが長くなり、とても見づらいものとなってしまいます。もうちょっとスマートな 書き方はあるのでしょうか?(一部略してあります) print "Content-type: text/html\n\n"; print "<html>\n"; print "<head>\n"; print "<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n"; print "<title></title>\n"; print "</head>\n"; print "<body>\n"; &analysis; &auth; sub analysis{ 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; $value =~ s/\r//g; $FORM{$name} = $value; } $pass1 = $FORM{'user_name'}; return; sub login{ if($pass1 eq '1'){ $check1 ="selected"; } elsif($pass1 eq '2'){ $check2 ="selected"; } else{ $check3 ="selected"; } print <<HEADER; <center> <caption><h1>ログイン</h1></cption> <table border="5" bgcolor="cfcfcf" width="300" height="150"> <tr> <td align="center" valign="center"> <form name="form" method="post" action="./xxx.cgi"> ユーザー名: <select name="user_name"> <option value="1" $check1>A</option> <option value="2" $check2>B</option> <option value="3" $check3>C</option> </select> <br><br> パスワード: <input type="password" name="password"> <br> <center> <input type="submit" name="submit" value="ログイン"> </center> </form> </td> </tr> </table> </center> HEADER } print "</body>"; print "</html>"; 1;

    • ベストアンサー
    • Perl
  • フォームで条件によってボタンの処理を変える

    フォームでパスワードを入力してもらい、確認用にもう一度入力した際、 誤入力があればアラート、正しく同じ値が入力されればsubmitにしたいと思っており、下記のようなコードを書きましたが、同じ値を入力した際にIEでエラーがでてしまいます(FirefoxやSafariでは動きます)。 当方Javascriptの知識に乏しく、どなたか助けていただけませんでしょうか?宜しくお願いいたします。 <html> <script language="JavaScript"> <!-- function passCheck(){ pass1 = document.free.PASSWORD.value; pass2 = document.free.PASSWORD2.value; if(pass1!==pass2) {alert("入力された確認用パスワードが違います");} else if(pass1==pass2) {document.free.submit.type="submit";} } //--> </script> <body> <form method="POST" action="submit.cgi" name="free"> <p> <input type="password" size="20" name="新パスワード" id="PASSWORD"><br> <input type="password" size="20" name="新パスワード(確認)" id="PASSWORD2"> </p> 確認のため、上記と同じパスワードをご記入ください。 <p><input type="button" name="submit" value="確認する" onclick="passCheck()"/></p> </form> </body> </html>