ようこそ ゲスト さん、新規登録(無料)して気になる疑問を解決しませんか?

質問

質問者:sumisumish 外部ファイルのインクルードについて
困り度:
  • すぐに回答を!
外部ファイルにデータベースアクセスの為のユーザ情報を書いておき、DB接続が発生するファイルにのみ、インクルードさせたいと考えております。下記のようなプログラムを記述したのですが、エラーが出てしまいました。自分でネットで調べたのですが、間違っていないように感じます。何か、間違っていますでしょうか?
my $dbh = DBI->connect部(グローバル変数が読み込めない)でエラーが発生しております。

#!/usr/local/bin/perl
use DBI;
require 'db.conf';

$ENV{ORACLE_HOME}='/opt/app/oracle/product/9';

my $dbh = DBI->connect($datasrc, $username, $password) || die DBI::errstr;
my $sql = "SELECT * FROM NAME";
my $sth = $dbh->prepare($sql) || die $dbh->errstr;
$sth->execute || die $dbh->errstr;
〜 省略 〜

---------db.confの中身(パーミッション755)---------
my $datasrc = "oracle9";
my $username = "test";
my $password = "password";
1; #return true

----------エラーログ------------------
Global symbol "$datasrc" requires explicit package name at /web/hthome/cgi/test.cgi line 7.
Global symbol "$username" requires explicit package name at /web/hthome/cgi/test.cgi line 7.
Global symbol "$password" requires explicit package name at /web/hthome/cgi/test.cgi line 7.

宜しくお願い致します。
質問投稿日時:08/03/13 16:58
質問番号:3859491
この質問に対する回答は締め切られました。
最新から表示回答順に表示良回答のみ表示

回答

良回答10pt

回答者:sakusaker7 require で読み込むファイルの中で my してしまうと、その名前は
そのファイルに限定された範囲でしか有効になりません。
したがって、require した側で同じ名前の変数を使っても、まったく別物になります。

require されているファイルの中で使っているmy をなくしても出ているエラーというのは
Global symbol "$datasrc" requires explicit package name at /web/hthome/cgi/test.cgi line 7.
Global symbol "$username" requires explicit package name at /web/hthome/cgi/test.cgi line 7.
Global symbol "$password" requires explicit package name at /web/hthome/cgi/test.cgi line 7.

これですか?
このエラーは use strict した状態でないとでないはずなんですが。
また、このエラーが発生したときはスクリプトの実行は一切されないので

> 文字列の取得はできているっぽいのですが、なぜかエラーになってしまいます。

文字列の取得もデータベースへの接続もできるはずがないのですが
なにか勘違いしてたりしませんか?

もし別の種類のエラーならどのようなエラーなのかの説明をお願いします。
種類:補足要求
どんな人:経験者
自信:参考意見
回答日時:08/03/14 01:43
回答番号:No.3
この回答への補足sakusaker7さん

私の勘違いでした。
外部ファイルの中からmyを外したら、問題なく読み込むことができました。ありがとうございました!
この回答へのお礼この回答にお礼をつける(質問者のみ)

回答

良回答20pt

回答者:shimix >myを外してみましたが、やはりダメでした。

そうですか・・。ただ、こちらで確認した限りでは

  reuqire 'inc.pl';
  print $test1 . "<br />";
  print $test2 . "<br />";

などとして、

  my $test1 = 'test1';
  $test2 = 'test2';

を読み込ませると、test2しか表示されないので、いずれにしても「my」はマズイと思われます。

「my」を外したあとでもエラーメッセージは変わりませんか?また

  print $datasrc;

などで表示させると「期待した値」が表示されますか?
種類:アドバイス
どんな人:経験者
自信:参考意見
回答日時:08/03/13 18:56
回答番号:No.2
この回答への補足shimixさん

ご回答ありがとうございます。
やはり、エラーメッセージは変わらなかったです。
文字列の取得はできているっぽいのですが、なぜかエラーになってしまいます。

もちろん、本体のファイル(test.cgi)に直接記述すると問題なく動作しているんですけどね。。。
この回答へのお礼myを外したら、問題なく表示させることができました!
ありがとうございました。

回答

 

回答者:shimix >my $datasrc = "oracle9";
>my $username = "test";
>my $password = "password";

requireで読み込む(最後はexitでreturnしている)のに、「my」でいいんでしょうか(Perlはよく知らないので外していたらごめんなさい)。
種類:アドバイス
どんな人:経験者
自信:参考意見
回答日時:08/03/13 17:41
回答番号:No.1
この回答への補足shimixさん

ご回答ありがとうございます。
myを外してみましたが、やはりダメでした。
また、何かお気づきの点があればお願いいたします。
この回答へのお礼この回答にお礼をつける(質問者のみ)
 
最新から表示回答順に表示良回答のみ表示