• ベストアンサー

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

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

  • ggaogg
  • お礼率86% (209/243)
  • Perl
  • 回答数1
  • ありがとう数1

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

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

STDIN からは、基本的にclose しなければ、何度でも読み込むことができます。 多分、質問者の仰っているのは、既に読み込んだデータをもう一度読み直せるかということかと思いますが、それはできません。 $strRead に読み込んであるんだからそれを再利用すればいいことだと思います。(あるいは、もう一度読み直すような処理が必要なら、ファイルなどに取って置いてそれを読み直すとか)

ggaogg
質問者

お礼

やはり無理ですか。 perlのスパゲッティソースを解消しようと思い、STDINから読み込むような処理を関数でまとめようと思ったのですが、そうすると処理が隠蔽されるため、そんな仕様を意識せずに関数を何度も呼び出して使うということが望まれます。 そのときにSTDINから1度読み込めてもその後は読み込めないとなると使い勝手が非常に悪いので、なんとかならないかと思った次第です。 しかしperlにはstatic宣言して静的メモリを確保するというようなことができません。 そういう面ではperlってちょっと使いづらい面もありますよね。。 STDINから何度も同じものを読み込むという手段は諦めて、何か他の方法を考えることにします。 ありがとうございました。

関連するQ&A

  • 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関数は拒否されました。

  • とほほさんのファイルのアップロードのことで

    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
  • cgiでのデータ受信

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

    • ベストアンサー
    • CGI
  • CGIファイル1つで掲示板

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

    • ベストアンサー
    • CGI
  • 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でpostが受け取れない

    perlでCGI を作ってみましたが、POSTでデータが受け取れません。GETは問題ないのですが。read stdin が NULL になります。 ローカルのapache2でテストしています。$ENV{'CONTENT_LENGTH'}がゼロのためだと 思いますが対応が分かりません。 OS:CENTOS6 (VirtualBox) APACHE2.2 Perl 5.10 /var/www/cgi-bin で実行。 呼び出しは <form action='localhost/cgi-bin/uptag.cgi' method='post'"> です。

    • 締切済み
    • 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でフォームデータを取得できません

    CGI(perl)の標準入力についてお伺いいたします。 PC上でテストし動作を確認したCGIをプロバイダのCGIサーバに移植しましたが、 正常に実行終了するものの、標準入力によるフォームデータの取得ができません。 フォームデータを受け取る変数が空になってしまいます。 PCとプロバイダのCGIサーバとでは、CGIスクリプトの記述方法が異なるのでしょうか。 書籍、ネットをだいぶ調べましたが、解決策が見当たりませんでした。 このような現象の原因について、お心当たりのある方がおられましたら、 ご教示いただきたいです。 (1)PC動作環境 a.OS: Windows 7 b.ブラウザ : Interne Eexplorer 11 c.CGIサーバ: Apache 2.4 d.perl : Activeperl 5.20 (2)CGIスクリプト(標準入力の部分) 尚、フォームでは、method="POST"を指定しております。 # フォームデータの取得 if($ENV{'REQUEST_METHOD'} eq 'POST') { read(STDIN, $query, $ENV{'CONTENT_LENGTH'}); } else { $query = $ENV{'QUERY_STRING'}; }

    • 締切済み
    • CGI
  • HTML5からのフォーム入力のデータ取得について

    HTML5からのフォーム入力のデータ取得について HTML5で入力フォームを作成しました。 これをCGI(Perl)で入力データを受け取って処理をしたいと考えているのですが HTML4の時みたいに、 if ($ENV{'REQUEST_METHOD'} eq "POST"){ read(STDIN, $querystring, $ENV{'CONTENT_LENGTH'}); } foreach $line (split(/&/, $querystring)){ my ($name, $value) = split(/=/, $line); } このやり方では入力項目の名前と値を取れないのでしょうか? $querystringの中身をみたら、 Content-Disposition: form-data; name="入力項目の名前" 入力した値 という文字の羅列が、入力項目分ありました。 この文字列から一つずつ項目名を拾って、値を拾って。。。 という作業をしないといけないのでしょうか? ネットで色々と探したのですが、 うまいやり方が見つからず、探し方が悪いのかもしれませんが、 どなたかデータの取得のやり方をご存じの方がいらっしゃいましたら 教えてください。 よろしくお願い致します。

    • ベストアンサー
    • Perl
  • 意味を教えてください(CGI)

    CGIの勉強をしています。 以下の意味を教えてください。 ・&error("2222");←"2222"の意味 ・&error("サーバーエラー。#101");←#101の意味 ----------------------------------- &decode; if($orden eq 'enviar' || $preview == '0'){ &enviar; } &previsto; &error("2222"); sub decode{ if ($ENV{'REQUEST_METHOD'} eq "POST"){ read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'}); }else{ &error("サーバーエラー。#101"); }

    • ベストアンサー
    • CGI

専門家に質問してみよう