- 締切済み
packageでうまく行かないところがあります。
2つのファイルがあります。 1つは「a.cgi」 2つは「a.pl」 a.cgiはperlで動くCGIです。 a.plもperlですが、packageにしてあります。 a.cgiの中でa.plを使っている場面があります。 a.plでDBを呼び出し値を取り出しているようになっています。そこで問題が発生しました。 a.plで値を取り出したのは良いのですがその値をa.cgiに持ってこようと思っているのですが値を返す事ができません。確実にa.plで値を取り出している事は確認していますが、a.cgiに戻ったときに値を持ってきていません。 私が試みた方法として return ($a); や return ('$a'); などで試みたのですができませんでした。 どうか教えて頂けないでしょうか? お願いします。
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- VanillaTea
- ベストアンサー率52% (13/25)
(1) a.pl内にsubが定義されていて、その関数をa.cgiから呼び出しているが、 returnで返した戻り値が設定されていない。 (a.plのpackage とのインターフェイスは関数のみ) (2) package宣言されたファイルa.pl内の変数を参照できない (a.plのpackageとのインターフェイスは変数) (1)、(2)どちらで困ってるのか分かりませんが。 (1) 単に$aに値が設定されていないため。あるいは、呼び出し側でその 値を正しく処理していないため。 コーディングミスである可能性が高い。 確実に取り出していることを確認した方法で、return直前に$aに設定されてる 値を確認する。 呼び出し側でその値を受けた変数に設定されていることを確認する。 ちなみに'$a'は、$aという文字列(リテラル)であって、$aの内容では ありません。 (2) $a=AAA::func(); print "$a\n"; print "$b\n"; print "$AAA::b\n"; package AAA; sub func { $b = 'abc'; return $b; } できたとしても、通常プログラミングではやりません。
- leaz024
- ベストアンサー率75% (398/526)
a.pl では package を使っているとのことですので、恐らく「名前空間」の違いにより変数の値を参照できていないのだと思います。 例えば、a.pl で「package NS1;」と宣言していれば、a.cgi から a.pl 内の変数「$a」を参照するには「$NS1::a」とする必要があります。 # a.pl 内の処理を関数化し、a.cgi から呼び出すようにした方がよいと思いますよ。