- 締切済み
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は同時に記述してはいけないのでしょうか? 同時に記述しないと目的のプログラムを実現する方法が大きく変わってきてしまうので、非常に困ってしまいます。 もし、ご存知の方がいらっしゃったら教えてください。 宜しくお願い致します。
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- sakusaker7
- ベストアンサー率62% (800/1280)
use と requireを同時に使ったのが理由ではありません。 #1の方の回答にある通り、use strict; をはずせばこのエラーは なくなると思いますが、 use strict; use DBI; require 'cgi-lib.pl'; require 'jcode.pl'; なんでCGI.pmとかJcode.pm を使わないのでしょう? これらを使えばuse strict していても問題ないはずです。 あとは our $in; our $parameter; our $name; を先頭付近に追加してもいけるかな?
- x415f484f
- ベストアンサー率71% (57/80)
use Strict を外すとどうなりますか? strict - 安全ではないコンストラクトを制限する Perl プラグマ http://perldoc.jp/docs/perl/5.8.1/strict.pod
お礼
すみません。私の勘違いでした。 use strict;をコメントアウトすることで 問題解決いたしました。 ご迷惑をおかけしました。 ありがとうございました!
補足
ありがとうございます。下記のコードにして実行してみました。 #!/usr/local/bin/perl #use strict; use DBI; require 'cgi-lib.pl'; require 'jcode.pl'; $ENV{ORACLE_HOME}='/opt/app/oracle/product/'; $ENV{NLS_LANG} = 'JAPANESE_JAPAN.JA16SJIS'; $ENV{NLS_LANGUAGE} = 'JAPANESE'; my $datasrc = "xxx"; my $username = "BBB"; my $password = "AAA"; my $sql = "SELECT NAME FROM PROFILE"; my $sth = $dbh->prepare($sql) || die $dbh->errstr; $sth->execute || die $dbh->errstr; $| = 1; read STDIN,$in,$ENV{'CONTENT_LENGTH'}; # 文字列を分解 ($parameter, $name) = split /=/, $in; ---------------省略----------------- しかし、エラーが「Can't call method "prepare" on an undefined value at /web/search.cgi line 20.」 と出てしまいました。 前の画面から文字列の受け渡しを行い、その文字列をSQLにセットし、特定のレコードを取得するには、上記のライブラリ構成では難しいでしょうか? 周りに相談する相手もいなくて、初歩的な質問で本当にすみません。
お礼
すみません。私の勘違いでした。 use strict;をコメントアウトすることで 問題解決いたしました。 ご迷惑をおかけしました。 ありがとうございました!
補足
sakusaker7さん ご回答ありがとうございました。 確かに、use strict;を外すと、この部分については動作するのですが、DB接続の記述で今度はエラーが発生していまします。その為、下記のようにしてプログラムを実行してみました。 use strict; use DBI; require 'cgi-lib.pl'; require 'jcode.pl'; our $in; our $parameter; our $name; our $dbh; ----------省略-------------------- しかし、下記のエラーで実行できませんでした。 Global symbol "$in" requires explicit package name at /web/search.cgi line 7. Global symbol "$parameter" requires explicit package name at /web/search.cgi line 8. Global symbol "$name" requires explicit package name at /web/search.cgi line 9. Global symbol "$dbh" requires explicit package name at /web/search.cgi line 10. Execution of /web/search.cgi aborted due to compilation errors. 前画面から受け取ったデータの文字列を使い、DB検索をするような事を実現するためには、やはりCGI.pmもしくはJcode.pmを利用しないとダメでしょうか? 質問ばかりですみません。