• 締切済み

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)のプログラムが期待通りの動きをするのか どうぞご教授のほどよろしくお願いいたします。 何か足りない情報や意味の分かりづらい個所がありましたら、仰ってください。 ちなみにこのプログラムは公開するために作成しているのではありません。 下手な説明、長文すみません。

みんなの回答

回答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