• 締切済み

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'); などで試みたのですができませんでした。 どうか教えて頂けないでしょうか? お願いします。

  • aeic
  • お礼率10% (60/582)
  • Perl
  • 回答数2
  • ありがとう数0

みんなの回答

回答No.2

(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)
回答No.1

a.pl では package を使っているとのことですので、恐らく「名前空間」の違いにより変数の値を参照できていないのだと思います。 例えば、a.pl で「package NS1;」と宣言していれば、a.cgi から a.pl 内の変数「$a」を参照するには「$NS1::a」とする必要があります。 # a.pl 内の処理を関数化し、a.cgi から呼び出すようにした方がよいと思いますよ。

関連するQ&A

  • サブルーチン Perl みたいに C言語 で使うには 

    いままで数年HPを運営していたためにCGIを開発する手段として、Perl言語を使用してきました。その後、あるきっかけでC言語をするようになり、理屈上PerlとC言語が似ていました。 いままで、Perlでは開発・デバッグ等を効率よくするためサブルーチンを他のファイルにパッケージファイルとして開発していました。非常に便利でこれがC言語でも同じく使えたらいいなとつくづく思っています。 Perl言語の例 main.cgi(本体のファイル) package.pl(パッケージファイル) 本体ほファイルで実行させ、実行の途中必要なサブルーチンをパッケージファイルから呼び出します。 呼び出すには、 %渡す値=&パッケージ名::サブルーチン名; 同じようにC言語でやるときはどのようにすればいいのでしょうか?

  • plファイルの中で他のplファイルを実行

    A.plファイルとそれに付随するpmファイルがあります。 別のB.plでA.plに値を渡しながらループさせてA.plを実行し得られた値をB.plに返すことがしたいのですが、 B.plで ループ始点 require('A.pl'); ループ終点 だと一回きりの実行結果しか得られず。 #`perl A.pl @AAA`; だとreturnできずエラー となってしまいます。 何か良い方法は無いでしょうか。 よろしくお願いいたします。

    • ベストアンサー
    • Perl
  • パッケージとモジュールについて

    こんにちは。Perlを学習し始めた初心者です。 Perl 5.87を使っており、標準モジュールを使う方法を書籍で読みました。 例えば、フォームに入力、送信されたデータを処理するために use CGI; と最初に記述して使うことができますが、 別のエラー処理の構文を見ると $CGI::POST_MAX と1行目に記述してあります。 パッケージとモジュールの概念が、よく分かっていないので戸惑って います。 C:\perl\lib にある、CGI.pmというモジュールを使用していると思う のですが、use CGI;と記述するときと $CGI::と記述するとき、何が異なるのでしょうか? 後者はCGI.pmの中にある、POST_MAX変数を使うということでしょうか? パッケージという言葉を見ても、よく分からずネットで随分調べましたが、余計に分からなくなってしまいました。 お忙しいところ申し訳ありませんが、よろしくお願い致します。

    • ベストアンサー
    • Perl
  • cgiとplとpm

    掲示板ソースをダウンロードするとplやpmという拡張子のものがありました。中身はPerlでした。 拡張子の使い分けを教えてください。 適当に4つのルールを書いてみましたので、間違っていたり、追加するルールがありましたから教えてください。 1 ブラウザがそれ自身にアクセスし、ブラウザのアドレスバーに表示させるならcgiにするべき。 2 Perlのpackageの機能を使うなら、パッケージファイルはplかpmでなくてはならない。 3 Perlのrequireの機能を使うなら、その外部ファイルはplでなくてはいけない。 4 Perlのuseの機能を使うなら、その外部ファイルはpmでなくてはならない。

    • ベストアンサー
    • Perl
  • デバッガでブレークポイントを削除できない

    今読んでる本、CGIプログラミング第2版ですが、いよいよ終盤です。 第15章 CGIアプリケーションのデバッグまで読み進めてきました。 Perlデバッガのコマンド表にあるコマンドを試しています。 b[ 行番号| サブルーチン名]コマンドでカレント行、指定行、指定サブルーチンへブレークポイントを設定できました。 今度は d[ 行番号| サブルーチン名]コマンドでブレークポイントを削除しようとしたのですが、削除できていませんでした。 何度試しても先ほど設定したブレークポイントで停止してしまいます。 さらに引数として行番号やサブルーチン名を与えたときは次のエラーが発生します。 Number found where operator expected at (eval 5)[/usr/lib/perl5/5.8.0/perl5db.pl:17] line 2, near "d 5" eval '($@, $!, $^E, $,, $/, $\\, $^W) = @saved;package main; $^D = $^D | $DB::db_stop; d 5; ;' called at /usr/lib/perl5/5.8.0/perl5db.pl line 17 DB::eval called at /usr/lib/perl5/5.8.0/perl5db.pl line 1323 DB::DB called at try line 4 (Do you need to predeclare d?) eval '($@, $!, $^E, $,, $/, $\\, $^W) = @saved;package main; $^D = $^D | $DB::db_stop; d 5; ;' called at /usr/lib/perl5/5.8.0/perl5db.pl line 17 DB::eval called at /usr/lib/perl5/5.8.0/perl5db.pl line 1323 DB::DB called at try line 4 syntax error at (eval 5)[/usr/lib/perl5/5.8.0/perl5db.pl:17] line 2, near "d 5" またDコマンドは全ブレークポイントを削除するそうですが、これも効きませんでした。 本件について、何か情報をお持ちの方、教えてくださいm(__)m

    • ベストアンサー
    • Perl
  • ショッピングカートのCGIを設定できません。

    全くの初心者なのですが、biglobeのサーバーを借りてネットショップを開きたいと思い、ルミーズカートをダウンロードしたのですが、設定の仕方がよく分からず、キブアップ寸前です…(T_T) マニュアルを見て、分からない言葉などは検索して何とか作ってアップロードまでし、設定画面は表示されたのですが、ストアの登録など出来ません。 Q&Aも見てみたのですが、データーベースの設定が悪いのか何が悪いのか全く分かりません。 データベースファイル用ディレクトリ変数($dbhome)の指定で、「「db」ディレクトリは、自動では作成されません。FTPクライアントソフト等を使用して、dbフォルダを作成してください。」とあったので、ffftpをダウンロードし各種設定をして、操作画面まで出たのですが、どうすればdbフォルダが作れるのかが分かりません…。 public_html の外に作るらしいので、「フォルダ作成」を選んで「db」と入れても何も作成されません。 public_htmlの中になら作れるのですが…。 で、外に作れなかったのでアクセス制御ディレクトリ「private」の中に「db」を作ったのですが、その場合の「$server」から見た相対パスは $dbhome= "../../private/db"; で、よろしいのでしょうか?     ↓ +-- public_html | +--private(ディレクトリ:755) | | | +--db(ディレクトリ:755)←ここにdb作りました。 | +-- html (ディレクトリ:755) | | | +-- .htaccess | +-- テンプレートファイル(ファイル:644) | +-- images(ディレクトリ:755) | | | +-- イメージファイル(ファイル:644) | +-- lib(ディレクトリ:755) | | | +-- cgi-lib.pl (644) | +-- Template.pm (644) | +-- Digest.pl (644) | +-- general.pl (644) | +-- g_images(ディレクトリ:755) | +-- addgoods.cgi (755) +-- auth.pl (644) +-- basicUtil.pl (644) +-- cart.pl (644) +-- dataprocesing.pl (644) +-- download.cgi (755) * +-- editgoods.cgi (755) +-- initdata.cgi (755) +-- jcode.pl (644) +-- main.cgi (755) ←ココが「$server」らしいです +-- movie.cgi (755) +-- remise.cgi (755) +-- result.cgi (755) +-- sql-engine.pl (644) +-- store.pl (644) +-- color.htm(644) それなりに一生懸命調べたやってみたのですがまるっきり、とんちんかんな事をしているかもしれません。 頑張って作りたいので、どなたか分かる方アドバイスをお願いします。 ルミーズカートマニュアル http://remcart.remise.jp/v2/faq/show/131

    • ベストアンサー
    • CGI
  • packageの中からのrequireがうまくいかない

    .pmファイルの中でrequireして別の.plファイルの中の関数を呼びたいのですがうまくいきません。 下記の例でmain.plを実行すると Undefined subroutine &module1::module2::hyoji のようになってしまいます。 どのようにしたら動くでしょうか --main.pl-- use module1; testprint(); --module1.pm-- package module1; sub testprint{   require "module2.pl"   hyoji(); #エラー    module2::hyoji(); # エラー   module1::module2::hyoji(); #エラー }1; module2.pl package module2; sub hyoji{   print "ZZZ"; }1; --main2.pl-- ちなみにこれは動きます require "module2.pl"; module2::hyoji();

    • ベストアンサー
    • Perl
  • windows2003でcgiを動作させるには

    社内イントラネットを開設しようと思っています。 windows2003サーバにIISをインストール後、Perlをインストールしました。 が、htmlは見る事が出来るのですが、cgiが開けません。 cgiを開くと、エラーメッセージが出てきます CGI Error The specified CGI application misbehaved by not returning a complete set of HTTP headers どのようにすれば、cgiが動作するのか、ご教授願います。 cgi・plファイルのマッピングから、IISの拡張機能での「許可」の設定もしてみましたが、できません。 *active perlをインストールした際、plファイルについては、マッピングが自動的にできていませんでした。拡張機能にも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は同時に記述してはいけないのでしょうか? 同時に記述しないと目的のプログラムを実現する方法が大きく変わってきてしまうので、非常に困ってしまいます。 もし、ご存知の方がいらっしゃったら教えてください。 宜しくお願い致します。

  • パッケージの仕方について

    //ファイル1 // testPackageパッケージとして定義 package testPackage; public class PackageDemo{ public static void main(String args[]){ testPackage.A a = new testPackage.A(); a.a1(); } } //ファイル2 package testPackage; public class A{ public void a1(){ System.out.println("a1"); } } という、JAVAファイルを2つ作り、デスクトップの「testPackage」というディレクトリの中に2つとも格納しました。 C:\Documents and Settings\Administrator\デスクトップ\testPackage>javac PackageDemo.java と実行したところ 「PackageDemo.java:6: シンボルを解決できません。 シンボル: クラス A 場所 : testPackage の パッケージ testPackage.A a = new testPackage.A(); ^ PackageDemo.java:6: シンボルを解決できません。 シンボル: クラス A 場所 : testPackage の パッケージ testPackage.A a = new testPackage.A(); エラー 2 個」というエラーが発生しました。どのように対処すれば良いでしょうか?分かる方はぜひご指導ください。お願いします。

    • ベストアンサー
    • Java

専門家に質問してみよう