• ベストアンサー

requireの使い方がわかりません。

noname#4147の回答

  • ベストアンサー
noname#4147
noname#4147
回答No.1

どのようにうまくいかないのか分からないので、 いくつか考えられる点を上げておきます。 1.requireされるファイルの最後で、1(真)を返していない。 ファイルの最後(サブルーチンの外)に「1;」等の記述があるか確認してください。 2.requireされるファイルのサブルーチンから、必要な変数にアクセスできない。 変数がmyで宣言されていると、外部ファイルからアクセスできません。 適切にスコープを宣言してください。 3.そもそもrequireできていない。 シェルが使える環境でしたら、「perl -e 'require "file";'」を実行して、 エラーが出ないか確認してください。(fileは実際のファイル名に置き換えてください。) 思い当たる箇所がなければ、perl -wc でのエラー表示や、 サブルーチン自体を、差し支えない範囲で載せていただけると 分かるかもしれません。

namiri_e
質問者

お礼

お答えいただいて本当にありがとうございました。 ご指摘どおり(1)が原因でした。 やっぱり特別な処理が必要だったんですね。 おかげさまで、正常に動くようになってとても助かりました。

関連するQ&A

  • requireの使い方のどこがおかしいのでしょう?

    言語はperlです。 789.cgiから456.plを呼び出したいのですが、シンタックスエラーが出てきます。 789.cgiのrequireに関する行をコメントにしたら実行されるのですが…。 requireを使わずに、サブルーチン自体を789.cgiの中に書き込むことには成功しているのですが、 イマイチrequireを使った呼び出しのコツがわかりません。 どなたかご教授下さい。 以下にスクリプトを示しておきます。 よろしくお願いします。 *****以下789.cgi***** #!/usr/local/bin/perl use CGI::Carp qw(fatalsToBrowser); require "456.pl"; $a=12; $b=15; $d="xxxxxxxx"; $d=&plus(); print "content-type:text/html\n\n"; print <<"HTML_HTML"; <html> <head> <title> ヒアドキュメント </title> <body> ***** <br> $d <br> ***** <br> $a <br> ***** <br> $b <br> ***** </body> </html> HTML_HTML ***********以下456.pl************ sub plus { my $a=10; my $b=10; $c=$a+$b; return $c; }

    • ベストアンサー
    • CGI
  • requireしたライブラリにuseを記入

    メール送信のプログラムを作っています。 本体のプログラムmain.cgiから、 メール送信用のサブルーチンを記入した、 email.plというのを require 'email.pl'; とメール送信が必要な場合だけ読み込んでいます。 この email.plに use Encode; や use Jcode; のようにuse文を記入するのは、 Perlの作法としては適切なのでしょうか。 それともuse文はmain.cgiに記入するのが適切なのでしょうか。 email.plにuse文を記入しても動きますし、 main.cgiにuse文を記入した場合とベンチマークを比べたりしましたが あまり変わらないのですが、 useはコンパイルしたときに実行されるので、 実行のときに読み込まれるrequireしたライブラリに記入していいのか不安なのです。 私としては必要なときだけ読み込みたいので、 email.plにuse文を記入したいのですが。 どうぞよろしくお願いします。

  • サブルーチンを外部ファイルでまとめる。

    幾つかのサブルーチンを複数のCGIで利用します。 現在は各CGIにまったく同じサブルーチンを書いていますが、美しくないです。 これを別ファイルにまとめて呼び出して利用と言うのは出来ないのでしょうか? 試しに「set.pl」や「set.ini」でサブルーチンを保存し、「require」で呼び出そうとしたのですが、500エラーが出ました。 何か設定が必要でしょうか?

    • ベストアンサー
    • Perl
  • 別ファイルのサブルーチン

    別ファイル(chiiki.pl)のパッケージ内にあるサブルーチンの処理を使用するために require './chiiki.pl'; CHIFOU::postlimit; に書いたのですが、エラーとはならないもののまったく動きません。 別ファイルchiiki.plは package CHIFOU; sub postlimit { いくつかの処理 } 1; となっていますがどこか問題があるのでしょうか?

  • requireで同じライブラリを複数回、呼び出すとどうなるか

    perlでの話なのですがrequireを使って、 例えば、以下のようにした場合、 同じファイルを何回もコンパイルすることになるのでしょうか。 どなたか教えていただけないでしょうか。 @xx=(1,2,3); for(@xx){ require "xx.pl"; } どうしてもCGIがサーバーに与える負荷を軽減したいので、 無駄なコンパイルならば、一回だけrequireするようにしたいのです。

    • ベストアンサー
    • Perl
  • useとrequireでエラー

    初歩的な質問で失礼いたします。 下記の記述でプログラムを実行すると正常にプログラムが動きます。(省略以降は全く同一のプログラムです) ■実行問題なし1 #!/usr/local/bin/perl require 'cgi-lib.pl'; require 'jcode.pl'; --------省略--------------- ■実行問題なし2 #!/usr/local/bin/perl use strict; use DBI; --------省略--------------- しかし、下記の記述だとエラーが発生していまいます。 #!/usr/local/bin/perl use strict; use DBI; require 'cgi-lib.pl'; require 'jcode.pl'; --------省略--------------- エラーログは、下記の通りです。 Global symbol "$in" requires explicit package name at search.cgi line 21. Global symbol "$parameter" requires explicit package name at search.cgi line 23. Global symbol "$name" requires explicit package name at search.cgi line 23. Execution of search.cgi aborted due to compilation errors. requireとuseは同時に記述してはいけないのでしょうか? 同時に記述しないと目的のプログラムを実現する方法が大きく変わってきてしまうので、非常に困ってしまいます。 もし、ご存知の方がいらっしゃったら教えてください。 宜しくお願い致します。

  • 「.pl」ファイルはサブルーチンのようなものなのですか?

    掲示板スクリプトなどを落としてファイルを見ると、「.pl」というファイルがたまにあります。 これはサブルーチン的なやくわりがあるのですか? もしそうなら、どうしてわざわざ「pl」に書き分ける必要があるのでしょうか。すべてひとつの.cgiに書けばいいのに。

    • ベストアンサー
    • Perl
  • 外部ファイルの読み込みにrequireを利用し、指定ファイルパスをスカ

    外部ファイルの読み込みにrequireを利用し、指定ファイルパスをスカラー変数で行うとエラーとなる ファイルには、外部実行の格納ファイル名が入っています。 処理をしたいことは、指定ファイルにある変数を利用して、外部ファイルを実行することです。 実行すると以下のエラーを出しています。 ------------------------------------------------------------------ Software error: Can't locate ./$cfl/puls.cgi in @INC ...略 ------------------------------------------------------------------ プログラムは以下の内容です。 ------------------------------------------------------------------ 省略 open(DATA,"$file")|| die &error(" $file を読み込みopen出来ません"); flock(DATA,1); @lines = <DATA>; foreach $line(@lines){ ($afl,$bfl,$cfl,$efl,$y3) = split("<>", $lines1); require './$efl/puls.cgi'; } close(DATA); 省略 ------------------------------------------------------------------ そもそもrequireでスカラー変数が使えないのか? そのあたりも調べてみたのですが分かりませんでした。 また今回の方法以外にやり方がございましたらご指導頂きたく書き込みいたしました。 お手数かけます。 よろしくお願いいたします。

    • ベストアンサー
    • Perl
  • Perl require 共通の変数 外部ファイル

    ファイルが多くなってきて、その中でも共通の変数があるので 外部ファイルにまとめたい・・・ ~test.pl~ #!/usr/bin/perl require("testcommon.pl"); print qq(Content-type: text/html\n\n); print <<END; <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=$CHARSET"> <title>外部CGIファイル読み込み</title> </head> <body> END print qq($test<br>$data<br>$NEW); print <<END; </body> </html> END exit; 1; ~testcommon.pl~ #!/usr/bin/perl $test = "テスト"; $data = "テストです"; $CHARSET = "UTF-8"; $NEW ="サーバー"; 1; まずこれが現在テスト中で サーバーAでは、これでいけているのですが、 サーバーBでは、これではいけず、 エラーログを見ると 「@INC~/usr/local/lib64/perl5~」 とでてます。これがどのような意味をささしているのかわからないです。 いつも1行目に書く「#!/usr/bin/perl」の部分を書き換えてみたのですが・・・ さらにサーバーBでは、ログファイルなど開く際、フルパスでないと開けません。 require("testcommon.pl");←これですと インターネットサーバーエラーとなってしまいます。 これはエラーログを見るとフルパスで指定と書いていたので、 require("/path/path/path/testcommon.pl"); のようにしました。 これで、一応表示はできたのですが、 testcommon.plで新しい変数を書き加えると、($NEW123 = "追加したい変数";) 表示されません。 またCHARSETでUTF-8を指定してますが、 更新や、再度ページに入ったりすると、 CHARSETの変数が反応していなかったりしています。ページでソースを確認すると 変数の部分が空欄になってます。 これは require("/path/path/path/testcommon.pl"); が読み込んでいなかったり読み込んでいたり もしくは、一度なにをしたのかわからないですが、このフルパスの場所に testcommon.plのファイルをおいて、そのときのままになっている など、原因、対処がわからず困っております。 ※というより結論としては、 共通の変数を1つのファイルでしようしたいということです。 ~common.pl~ $a = 123; $b = "テスト"; $c = 2; ~test1.pl~ $TEST = $a * $c; print "$b$TEST\n"; #結果「テスト246」 ~test2.pl~ $TEST123 = $a + $c; print "$TEST123$b; #結果「125テスト」 このような感じ・・・(+_+)

  • PHPでhttp上の外部ファイルをrequireしたい

    PHPでhttp上の外部ファイルをrequireしたいのですが、変数がうまく 参照できません。例えば以下のようにすると、common1.phpの中で $a=$a+1 と書いても、11と出力されずに10と出力されます。 (require自体はうまく行っているようで、common1.phpの中で print等を書くとそれ自体は問題なく実行されます。) require("./common1.php")のようにファイル指定だと問題なく11と 出力されます。原因・解決方法等ご存じのかたがいらっしゃったら 教えてください。FedoraCore4 PHP5.0.4です。 <?php $a = 10; require("http://hogehoge/common1.php"); print "$a"; ?>

    • 締切済み
    • PHP