• ベストアンサー

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);は何を読み込んでいるのですか?コメントアウトしても大丈夫でしょうか? イメージマジックは使うのでそのままにしてあります よろしくお願いします

  • flash0
  • お礼率97% (297/306)
  • Perl
  • 回答数3
  • ありがとう数4

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

  • ベストアンサー
  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.3

> エラーチェックははずそうと思います CGI:Carpは「エラーチェック」ではありません。 通常、CGIでエラーになった時などは「500 Internal Server Error」とかブラウザに表示されるだけで、何が起ったかわかりません。 それを、Perlのエラーメッセージをhttpサーバーのログやブラウザ画面に出力するようにして、エラー内容を確認できるようにするためのものです。 fatalsToBrowserは、エラー内容がブラウザに表示されるので、公開している状態での使用はセキュリティ上問題ですが、CGI::Carp自体は、ログや特定のファイル等に出力されるので、ちゃんと設定した上で残すのがいいかと思います。 > :formはHTMLのフォームを出力するだけですか? http://perldoc.jp/docs/modules/CGI-3.49/CGI.pod#CREATING32STANDARD32HTML32ELEMENTS: http://perldoc.jp/docs/modules/CGI-3.49/CGI.pod#CREATING32FILL-OUT32FORMS: HTMLの文字列を作成します。出力はしません。 > perlはphpと違ってuse CGIを使わないと定義された関数を使えないんですか? 外部で定義された関数を、何の手続きもなく使える言語、というのは、ちょっと思い付きません。 PHPでも、requireとかを使って別のファイルに書かれたプログラムを呼び出したりしますよね? CGiモジュールは、Perlという言語の一部ではなく、後から機能を追加するモジュールです。 現在では、Perlをインストールすると、多くのモジュールも一緒にインストールされますが、本来は、別途インストールしなければ使えないものです。

flash0
質問者

お礼

回答ありがとうございます 調べたらつかわれていました! これだとおもうのですがどうゆう意味でしょうか? $q = CGI->new; %FORM = $q->Vars;

flash0
質問者

補足

phpではアロー演算子はclassのメソッドを呼び出すときに使われますが perl use CGIもclassなのでしょうか?

その他の回答 (2)

  • ORUKA1951
  • ベストアンサー率45% (5062/11036)
回答No.2

内部で使っていないならコメントアウトしても構いませんが、意味なくおかれているとは思いません。  use CGI::Carp qw(fatalsToBrowser);を残して、use CGI qw(:cgi :form);をコメントアウトして実行させれば、使われているかいないかすぐ分かりますよ。  use CGI::Carp qw(fatalsToBrowser);はローカルでテストできる環境にあればないほうが良いかも・・

flash0
質問者

お礼

回答ありがとうございます 調べたらつかわれていました! これだとおもうのですがどうゆう意味でしょうか? $q = CGI->new; %FORM = $q->Vars;

flash0
質問者

補足

phpではアロー演算子はclassのメソッドを呼び出すときに使われますが perl use CGIもclassなのでしょうか?

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.1

マニュアルより http://perldoc.jp/docs/modules/CGI-3.49/CGI.pod#USING32THE32FUNCTION-ORIENTED32INTERFACE 読めばわかると思いますが。 これらの関数群を別な方法で置き換えるなら削除しても問題ありません。 このまま使うつもりなら必要です。 use CGI をコメントアウトしたい、ということから考えるに、CGI用のスクリプト(の一部)を単体動作用のスクリプトに使いたい、ということだと思いますが、そうなのでしょうか? もし、そうではなくてCGIとして使いたい、ということなら、デバグ中はCGI::Carpはそのままにした方がいいと思います。 そうでないと、何処でエラーになっているか解らないので

flash0
質問者

お礼

回等ありがとうございます 完成しているのでエラーチェックははずそうと思います :formはHTMLのフォームを出力するだけですか? perlはphpと違ってuse CGIを使わないと定義された関数を使えないんですか?

関連するQ&A

  • 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について

    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: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
  • 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を使用する方法はありませんか?

  • ファイルをアップロードするCGI

    ファイルをアップロードしたいCGIが欲しく サンプルをみつけたのですが、このCGIだと ファイルをアップロードしたときに、ファイル名がアップロードした時刻になってしまいます。 ファイル名を変更することなく、アップロードするにはどう変更すればよいのでしょうか? お願いします。ちなみにアップロードしたいファイルの種類はエクセル形式のファイルです。 プログラムは以下のようになってます。 #!/usr/bin/env perl use strict; use CGI; use CGI::Carp qw(fatalsToBrowser); use POSIX qw(strftime); my $q = new CGI; print $q->header(), $q->start_html(); #print $q->dump; # for debug my $outputdir = "log"; # ファイルを置く先 (ディレクトリ) my $fh = $q->param('uploaded_file'); my ($ex) = ($fh =~ m|(\.[^./\\]+)$|); # 拡張子 if ($fh ne "") { my $timestamp = strftime "%y%m%d%H%M%S", localtime; my $outputfn = "$outputdir/$timestamp$ex"; open(F, "> $outputfn") or die; flock(F, 2); if (defined $fh) { while (<$fh>) { print F $_; } } close F; print qq{saved as <a href="$outputfn">$outputfn</a>}; } print $q->start_multipart_form(-name => 'myform'), $q->filefield(-name => 'uploaded_file'), $q->submit("OK"), $q->endform, $q->end_html(), "\n";

  • CGIでPERLのモジュールの有無をしらべたい

    telnetやsshなどで行うのではなく、CGIスクリプト上でサーバーにPerlのモジュールが使えるかどうか調べたいのです。 たとえば Crypt::DSA Image::Magick などが使えるかどうかです。 いわゆる ブラウザ上で Crypt::DSAがインストールされていません。NGです。 とか Image::Magickはインストールされています。OKです。 のようにです。 恐れ入りますがよろしくお願いいたします。

    • ベストアンサー
    • CGI
  • 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
  • Image::Magickの使い方を教えてくださいm(__)m

    CGIプログラミング第2版 P383のサンプル"commute_pie2.cgi"が動きません!! サンプルどおりのスクリプトを作成したのですが、フォーマットが不正というようなエラーになってしまいます。 エラー箇所を突き止めたので見てください。 エラー内容をお見せしたいため、次の簡易スクリプトを作成しました。 #!/usr/bin/perl use Image::Magick; my($mgk) = new Image::Magick(format => "png"); これを実行すると Exception 410: Invalid attribute (format) at /usr/lib/perl5/site_perl/5.8.0/i386-linux-thread-multi/Image/Magick.pm line 66. というエラーメッセージになります。 おそらくフォーマットとして"png"というリテラル値を指定しているが、このリテラル値が誤っているのではと予想しています。 どなたかImage::Magickの使い方を教えてください!! 環境はCD3枚組のRed Hat Linux 8をフルインストールしています。

    • ベストアンサー
    • Perl
  • CGIスクリプトのブラウザから実行エラー

    OS:  RedHatLinux7.2 perl -v :  This is perl, v5.6.2 built for i686-linux HttpErrLog:  display: Unable to connect to X server ().  Premature end of script headers: /XXX/XXX/XXX.cgi GD::Graphを用いたperlスクリプトをブラウザから実行すると、 上記のようなエラーとなってしまいます。 コマンドでの実行では問題無く動作します。 「print」のみの簡易cgiで試行しましたが、問題なく実行されます。 cgiのパーミッションも確認しました。 ソースは以下の通りです。 作業が進まなくて困っています。 どなたかお知恵をお貸しください。 perl.cgi: --------------------------------------------------------- #!/usr/bin/perl -- use strict; use GD::Graph::bars; my @xLabels = qw( Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec ); my @data2002 = qw( 17 19 26 38 56 64 67 53 40 29 21 13 ); my @data2003 = qw( 19 24 27 41 56 69 75 60 44 33 22 15 ); my @data = ( \@xLabels, \@data2002, \@data2003 ); my $graph = GD::Graph::bars->new( 800, 600 ); $graph->set( title => "Rainfall 2002/2003", y_label => "Millimetres" ); my $image = $graph->plot( \@data ) or die( "Cannot create image" ); open( OUT, "| display -") or die( "Cannot display image: $!" ); binmode OUT; print OUT $image->png(); close OUT; ---------------------------------------------------------

  • "use CGI::Session"でエラーが発生してしまいます

    初投稿です。宜しくお願いします。 ActivePerl5.8.0+Apache1.3.14でSessionを使用した Webサイトを作成中なのですが、 ppm経由でインストールしたCGI::Sessionを useしようとしても、エラーになってしまいます。 サンプルコードは以下の通りです。 #!/usr/bin/perl use CGI::Session; &ses(); &print(); sub ses() { # Session作成・ここから my $session = new CGI::Session(undef, undef, {Directory => './tmp'}); my $tmpSID = $session->id(); $session->param('menu', 'MENU1'); $session->expire('+2h'); $session->header(); } sub print() { print "Content-type: text/html;charset=ISO-2022-JP\n\n"; print <<EOF; OK! EOF } use CGI::Session; の部分(と、Session関数を 呼び出している部分)をコメントアウト すると、とりあえずはエラーが出なくなるので、 原因はここだとわかっているのですが、 文法的に間違っているとは思えないですし、 困っています。 情報お願いいたします。

    • ベストアンサー
    • Perl

専門家に質問してみよう