• 締切済み

Perlで作成したCGIについて

Perlで作成したCGIについて Perlで作成したCGIについて質問させていただきます。 #################### ##(1)system.cgi ## #################### #!c:/Perl/bin/perl.exe use strict; use warnings; use CGI; use CGI::Carp('fatalsToBrowser'); use CGI qw(:standard); print "Content-type:text/html;charset=utf8\n\n"; system('C:\\test.txt'); ##################################################### C直下にあるtest.txtの中身は「abcd」など 簡単なものです。 ##################################################### ################### ##(2)win32.cgi ## ################### #!c:/Perl/bin/perl.exe use strict; use warnings; use CGI; use CGI::Carp('fatalsToBrowser'); use CGI qw(:standard); use Win32::API; print "Content-type:text/html;charset=utf8\n\n"; my $MessageBox = Win::API -> new("user32","MessageBoxA","NPPN","N"); $MessageBox -> Call(0,"HelloWorld","Message",0); ##################################################### ##################################################### 以下にスペックを書きます。 Microsoft Windows XP Professional version2002 Service Pack2 Genuine Intel(R)CPU L2300 @1.50GHz 1.50GHz,1.49GB RAM ・ActivePerl ver5.10.1 built for MSWin32-x86-multi-thread ・Apache Apache 2.2.14(Win32) ##################################################### 上記の(1)、(2)のプログラムをエクスプローラ上(ローカル)で実行させて(1)ではテキストファイルを、 (2)ではメッセージボックスを表示させたいです。 結果は時間がかかるだけでTimeOutの設定である5分で切れてしまい何も起こりません。 しかし、全く同じプログラムで拡張子を.plに変更してコマンドプロンプトで実行すると、 期待通り(1)はテキストファイルが開かれ、(2)ではメッセージボックスが出てきます。 (1)、(2)ともCGIではsystemおよびMessageBoxの部分をコメントアウトして print文などを書けば普通にエクスプローラに表示されます。 (かなりhtmlとしては不備があると思いますが・・・) どうすればCGIで(1)、(2)のプログラムが期待通りの動きをするのか どうぞご教授のほどよろしくお願いいたします。 何か足りない情報や意味の分かりづらい個所がありましたら、仰ってください。 ちなみにこのプログラムは公開するために作成しているのではありません。 下手な説明、長文すみません。

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

みんなの回答

回答No.1

CGIは、クライアントに対してはhtmlを動的に生成し出力するのが(一般的な)使い方です。 やりたいことを想像すると、以下のようなcgiになると思います。 use strict; use warnings; use CGI; use CGI::Carp qw(fatalsToBrowser); use CGI::Pretty; my $java_script = << "END_SCRIPT"; function onload() { alert('Hello javascript', 'New Window', 'width=300, height=300'); }; END_SCRIPT my $q = CGI->new(); print $q->header( -charset => 'UTF-8' ), $q->start_html( -lang => 'ja', -title => ' T I T L E ', -script => { -language => 'javascript', -code => $java_script } ); my $file = shift || '/tmp/tmp.txt'; open my $fh, '<', $file or die "$!:$file"; my $text = do {local $/ = undef; <$fh>}; close $fh or die "$!:$file"; print $q->p($text), $q->end_html; 色々書いてありますが、上のcgiを実行すると以下の内容がprintされるだけです。 --- Content-Type: text/html; charset=UTF-8 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" lang="ja" xml:lang="ja"> <head> <title> T I T L E </title> <script type="text/javascript">//<![CDATA[ function onload() { alert('Hello javascript', 'New Window', 'width=300, height=300'); }; //]]></script> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" /> </head> <body> <p> aaaa </p> </body> </html>

a205048
質問者

お礼

回答ありがとうございます。 お礼が遅れてしまい、大変失礼いたしました。 補足なのですが、win32::APIを必ず使ってウインドウ画面を出力させたいと考えております。 説明不足で申し訳ありません。 もしよろしければ、さらに、ご教授のほどよろしくお願いいたします。

関連するQ&A

  • use CGI

    サンプルスクリプトのなかに use CGI qw(:cgi :form); use CGI::Carp qw(fatalsToBrowser); use Image::Magick; と書かれていたのですがuse CGI::Carp qw(fatalsToBrowser);は意味わかったのでコメントアウトしましたがuse CGI qw(:cgi :form);は何を読み込んでいるのですか?コメントアウトしても大丈夫でしょうか? イメージマジックは使うのでそのままにしてあります よろしくお願いします

    • ベストアンサー
    • Perl
  • PerlのCGIでフォームのテキスト配列をPerlで取得するには?

    フォームで通常は同じ名前のデータを取得することは無いのですが 表計算のように同じ名前の場合、データの取り出し方がわかりません。 以下、通常の1件の場合のソースです。 #!/usr/bin/perl $| = 1; use strict; our %in; use CGI::Carp qw(fatalsToBrowser); use CGI qw(:standard); require 'jcode.pl'; require 'cgi-lib.pl'; # #-----分岐----- &ReadParse; # 配列でない場合 my $namae = $in{'namae'} print "$namaeで名前が1件表示される"; # これをフォームで namaeが配列になった場合、 #<input type="text" name ="namae"> #<input type="text" name ="namae"> #<input type="text" name ="namae"> # のような場合、3件取得する場合 exit; __END__

    • ベストアンサー
    • CGI
  • 次のcgiファイルを開くには? もう一度

    http://oshiete1.goo.ne.jp/qa3951263.html で質問している者です。 間違って、[回答への補足] に書いてしまいました。 もう一度質問させてください。すみません。 Location を 教えていただき、とても感謝しております。 でも、私の 001.cgi は 以下のように始まっております。 print header(-charset => 'Shift_JIS'); print start_html("001.cgi"); このprint header(-charset => 'Shift_JIS');を消して if (param('answer') eq $ans){ print ('Location:002.cgi\n\n'); } else{ print header(-charset => 'Shift_JIS'); ##省略## print endform; { としたのですが、だめでした。 if (param('answer') eq $ans) が 下の方にもう一度出てくるからでしょうか? ###### はじめ ##################### #!/usr/bin/perl -T use strict; use warnings; use CGI qw(-debug :standard); print "Location:1266.cgi\n\n"; ###### おわり ##################### としたら、001.cgi を開くと 002.cgi へ飛ぶことができました。 どこに print "Location:1266.cgi\n\n"; を書けばよいのでしょうか? よろしく、お願いいたします。

    • ベストアンサー
    • Perl
  • Perlを始めたんですが

    プログラミングを始めようと思ってPerlをしているのですが プログラムを書いて開くとすぐに画面が消えてしまいます ActivePerlというのはいれてあります 書いたプログラムはこんなものです use strict; use warnings; print "Hello world";

    • ベストアンサー
    • Perl
  • use strictが効かない (PERL)

    たびたびお世話になっております。 PERL version 5.14.2 をWindows 7 のコマンドプロンプトから起動して使っています。 use strict; と一行目に書くと 宣言されていない変数があれば拒絶されるとのことで #!/usr/bin/perl use strict; use warnings; $a = 10; print "$a\n"; というスクリプトを書きました。が、すんなり動いてしまいます。 use strict; は どうすればうまく効くのでしょうか。 ご指導お願いします。

    • ベストアンサー
    • Perl
  • opendir apache 絶対url

    apache上でcgi-bin/ファイル.cgiのファイル.cgiから特定のディレクトリハンドルを開くために #!/perl/perl/bin/perl -wT use strict; use CGI::Carp qw(fatalsToBrowser); opendir DH, "http://localhost/image/"; opendir DH, "http://localhost/image/" or die "error"; for (readdir DH){ print; } としたのですが オープンできません opendirのパスに絶対urlや相対urlを使用する方法はありませんか?

  • perl ハッシュ エラー

    現在perlの勉強中で、ハッシュの項目まできました。しかし、use strictにするとこのコードがエラーになります。 #!/usr/bin/perl use strict; use warnings; print "Content-type:text/html\n\n"; $hoge{"key1"} = "value1"; print $hoge{"key1"}; exit; ヴァージョンは5.8.9です。use strictをコメントアウトすればエラーはでません。どうしてエラーになってしまうのでしょうか?どうすればエラーを出さずに表示することができるのでしょうか?どうかご教授ください。よろしくお願いします。

    • ベストアンサー
    • Perl
  • CGI::Carpを使っているのにInternal Server Error

    うまく動きません。コマンドラインでは作動するのですが、ブラウザではダメでした。  #! /usr/bin/perl -w  use Calendar::Simple;  use CGI::Carp qw(fatalsToBrowser);  use Data::Dumper;  use lib "/home/kojima/kojima00001/myperl/lib";  my @curr=calendar;  print Dumper(@curr); もっともその理由は分かりました。  use lib "/home/kojima/kojima00001/myperl/lib"; が  use Calendar::Simple; より後にあったことです。 さらに言うと、ブラウザで動かすためにはHTMLをサポートしていないといけませんが、このコードはHTMLをサポートしていません。 この2点を修正して、無事このプログラムはブラウザでもうまく動いたのですが、問題はうまく動いてくれていなかった時のブラウザの表示です。 Internal Sever Errorが出ていました。それじゃ何のことか分からなくて嫌だから  use CGI::Carp qw(fatalsToBrowser); と宣言してあるのです。 モノの本によると、この場合は  Software error:  Can't locate Calendar/Simple.pm in @INC (@INC containts: @INCに含まれるディレクトリがズラズラ・・・).  BEGIN failed--compilation aborted at calendar.cgi line3. というエラーメッセージが表示されるはず。 つまりCGI::Carpが機能していないことになります。 何故でしょう? お手数をお掛けします。

    • ベストアンサー
    • Perl
  • Perl:CGI.pm:入力ボックスのクリア?

    お世話になります。 下のサンプルコードは、CGI.pmのperldocに載っていたサンプルを改造したものです。 #! /usr/bin/perl # # simple.cgi -- CGIフォームの実験 use CGI qw/:standard/; use CGI::Carp qw/fatalsToBrowser warningsToBrowser/; print header( -expires=>'-1d', -pragma => 'no-cache', 'Cache-Control' => 'no-cache'), start_html('Simple Script'), h1('Simple Script'), start_form, "What's your name? ",textfield(-name=>'name', -default=>""),p, submit, end_form, hr,"\n"; if (param) { print "Your name is ",em(param('name')),p, } print end_html; 改造点はheader関数にexpires、pragma、Cache-Controlを入れてみたこと、 textfieldに-default=>""を入れてみたこと、 UIと表示項目を1つに減らしたことです。 やりたいのは、上のテキストボックスに名前を入れて、submitを押した瞬間に、上のtextboxをクリアすることです。 ぼくの理解では、最初に上記のCGIがあるURLにアクセスしたときにはプログラムは全部走ってしまう、paramがゼロだからそのときは入力表示を出すだけ、 実行を押した後もう一度このプログラムは最初から走る、paramに値があるから出力が表示される、というものです。 となれば、2度目に(入力を得て)実行されるときは、headerのcache関係の項目や、textfieldのdefaultが効いて空白になりそうな気がしますが、現実には最初に入った値がそのまま動き続けます。 これをPerl側で空白になるように制御できるでしょうか。 サーバーはFreeBSD(レンタル)、Perlは5.12、WebサーバーはApacheです。 クライアントはWindows7でIE9、Firefox22、Chrome28を使っています。 よろしくお願いします。

    • ベストアンサー
    • Perl
  • 極めて簡単そうな問題

    これからデータベースと連携するサイトをPerlで作ろうとしているにもかかわらず、下記のスクリプトでさえエラーが出ます。どうやら、最初のprint文でいつもエラーが出ます(Bareword found where operator expected ...)。何がいけないのか、教えてください。お願いします。 #! c:\Perl\bin\perl print "Content-type: text/html\n\n"; use CGI qw(:standard); use Win32::ODBC; print << body1; <html><head> <title>Order Form</title> </head></html> body1 exit();

    • ベストアンサー
    • Perl

専門家に質問してみよう