質問:エラーでハマっている為、use AutoLoaderする際の記述法と概念を知りたいです

このQ&Aのポイント
  • エラーでハマっている為、use AutoLoaderする際の記述法と概念を知りたいです。
  • test.cgi内でuse AutoLoader 'AUTOLOAD';と記述する際、sub AUTOLOADが必要ないと解釈していますが、なぜRegistDataL.alという名前でのエラーが発生するのか分かりません。
  • また、test.cgi内でuse AutoLoader;とした場合、どのようにsub AUTOLOADを記述すれば良いのでしょうか。
回答を見る
  • ベストアンサー

エラーでハマっている為、use AutoLoaderする際の記述法と概

エラーでハマっている為、use AutoLoaderする際の記述法と概念を知りたいです。 ----------------------------------------------- test.cgi use lib '/var/www/lib'; unshift @INC, '/var/www/lib'; use AutoLoader 'AUTOLOAD'; RegistDataList();#ここで存在しない関数を呼び出す ----------------------------------------------- ●自作モジュール(UserEditCommon.pm) ----------------------------------------------- package UserEditCommon; BEGIN{ use Exporter(); @ISA = qw(Exporter); @EXPORT_OK = qw(RegistDataList); } use utf8; use open ":utf8"; use open ":std"; use AutoLoader 'AUTOLOAD'; 1; __END__ ここ以降に色々な関数が記述されていますが、元々ライブラリーだった為、OOP的なコンストラクタやデストラクタは記述していません。 ---------------------------------------------- $ perl -e 'use AutoSplit; autosplit($ARGV[0], $ARGV[1], 0, , 1)' UserEditCommon.pm auto 上記を実行すると、auto/UserEditCommon/関数名.alファイルが沢山出来ました。 それを/var/www/lib/autoとしてUP ●下記を参考にしているのですが http://perldoc.jp/docs/perl/5.8.0/AutoLoader.pod.pod 抜粋「B<AutoLoader>のAUTOLOADサブルーチンために、 明示的にそれをインポートI<しなければなりません>。」 とある為、 use AutoLoader 'AUTOLOAD'; と記述する際はtest.cgi内ではsub AUTOLOADが必要ないと解釈しています。 実行した際、 Can't locate auto/main/RegistDataL.al in @INC (@INC contains: /var/www/lib ... となり、auto/main/のRegistDataList.alが呼ばれているはずなのに、なぜRegistDataL.alという名前でのエラーなのでしょうか ●またtest.cgi内で use AutoLoader; とした場合のsub AUTOLOAD内の記述をお教え願えませんでしょうか sub AUTOLOAD { #print "$AUTOLOAD は未定義です"; my $sub = $AUTOLOAD; $sub =~ s/.*:://; $AutoLoader::AUTOLOAD = $sub; goto &AutoLoader::AUTOLOAD; } 上記のようにしても、エラー内容が Can't locate auto/AutoLoader/RegistDataL.al in @INC (@INC contains: /var/... となってしまい、どうすればよいか途方にくれています。

  • taku0
  • お礼率80% (160/199)
  • Perl
  • 回答数3
  • ありがとう数7

質問者が選んだベストアンサー

  • ベストアンサー
回答No.3

違いますよ。Exporter は 別モジュールで定義されている関数を、 "モジュール名::関数()" ではなくて、"関数()" で呼び出すために使っています。 -- Bar.pm package Bar; use strict; use warnings; use base qw(Exporter); our @EXPORT_OK = qw(function1 function2); sub function1 { print "call function1. EXPORT_OK\n"; } sub function2 { print "call function2. EXPORT_OK\n"; } sub function3 { print "call function3. No EXPORT\n"; } 1; -- test.pl use strict; use warnings; use lib './'; use Bar qw(function1); # Bar::function1をインポートする function1(); # call function1. EXPORT_OK # function2(); # これはできない Bar::function2(); # call function2. EXPORT_OK # function3(); # これはできない Bar::function3();# call function3. No EXPORT

taku0
質問者

お礼

use AutoLoader 'AUTOLOAD';を使った例と使わない例とで 分かりやすく事例をご教授頂きありがとうございます。 また、その後の調べで use base qw(Exporter); は use Exporter; our @ISA = qw(Exporter); と等価な事も勉強になりました。 Exporterは、直接"関数()" で呼び出し可能になるんですね。 また our @EXPORT_OK = qw(function1 function2); としていても、 呼び出し元で use Bar qw(function1); としていた場合は、 function2(); # これはできない というのも理解出来ました。 @EXPORTや@EXPORT_OKにエクスポートしたいシンボルのリストが入っていなくても、 パッケージ名を付ければ、呼び出し可能という事も大変分かりやすい事例としてご教授頂いていた為、理解できました。 Bar::function3();#呼び出し可能 何度も読み直し調べ直し、理解するのに多少時間を要しましたが、この度は色々と分かり易いご解説、本当にありがとうございました。

その他の回答 (2)

回答No.2

Foo.pm 内でAutoLoaderをuseしているので、test.pl では、FooだけuseすればOKです。

taku0
質問者

お礼

test.plで our @EXPORT_OK = qw(function1); している為、要求された時のみエクスポートする際、Foo.pmのAutoLoaderが効く形になるんですね。 なるほどですね~そうなんですか~~ 色々ありがとうございます!!

回答No.1

使用する関数をexportするか、モジュール名::関数 で呼び出す必要があると思います。 # Foo.pm package Foo; use strict; use warnings; use AutoLoader 'AUTOLOAD'; use base qw(Exporter); our @EXPORT_OK = qw(function1); 1; __END__ sub function1 { print "Foo::function1. EXPORT OK function\n"; } sub function2 { print "Foo::function2. No EXPORT function\n"; } # test.pl use strict; use warnings; use lib './'; use Foo qw(function1); function1(); Foo::function2(); $ perl -e 'use AutoSplit; autosplit($ARGV[0], $ARGV[1], 0, 1, 1)' Foo.pm ./auto $ perl test.pl Foo::function1. EXPORT OK function Foo::function2. No EXPORT function

taku0
質問者

お礼

ourする必要があったんですね。 後、オートロードさせたいFoo.pmモジュールもUPする必要がある事と(必要ないのかな・・と思ってた事と文字化けに苦しみ、モジュール化とオートロード等この辺りが初めての取り組みでしたので、頭の中で整理できていませんでした) ご教授頂いた test.pl内で use Foo qw(function1); しておけば、無理に test.pl内で use AutoLoaderして自分で関数作る必要もなかったって事だったんですね。恐れ入ります。 メインのtest.plで use AutoLoaderしないのは、 mod_perlの場合などでは何でもかんでもオートロードしてしまう為、よくないという話をどこかで拝見したのですが、その事につながる為って事なのでしょうか・・ もし、何かご助言頂けるようでしたらお願いしたいのですけれども いずれにしても、お陰様で無事動かすことができました! ありがとうございます

関連するQ&A

  • use lib qw(変数名);は無理?

    モジュールへのパスを設定するのに以下のようにすると use lib qw($cmd_path); Can't locate BL/FileIO.pm in @INC (@INC contains: $cmd_path /usr/lib/perl のようにエラーになり、$cmd_path が展開されません。 use lib qw("$cmd_path"); use lib q"$cmd_path"; など色々試したのですが、ダメでした。 設定する方法はあるのでしょうか? $cmd_path はベタ書きしかないのでしょうか?

  • perl niftyについて。use CGI;

    画像アップロードのスクリプトを作ろうと思っているのですが、 use CGI; という記述をすると、ここでエラーに引っかかります。 下はperl checkerでのエラー表示です Can't locate CGI.pm in @INC (@INC contains: /usr/local/lib/perl5/5.00503/sun4-solaris /usr/local/lib/perl5/5.00503 /usr/local/lib/perl5/site_perl/5.005/sun4-solaris /usr/local/lib/perl5/site_perl/5.005 .) at a.cgi line 10. BEGIN failed--compilation aborted at a.cgi line 10. 参考URLはここ http://www.topstudio.co.jp/~kmuto/html/node38.html niftyでは使えないようになってしまっているのでしょうか? また、CGI.pmを使わないファイルアップロードの仕組みを解説しているサイトを知っている方がいたら、教えてくださいませ。

    • ベストアンサー
    • CGI
  • use Util;を使いたいのですが・・・

    初歩的な質問で失礼いたします。 CentOSのサーバーでcgiでプログラムを作成しているのですが、 「use Util;」を宣言時にエラーが発生してしまいます。 【エラー内容】 Can't locate Util.pm in @INC (@INC contains: ./lib /usr/lib/perl5/site_perl/5.8.8/i386-linux-thread-multi yumやcpanのコマンドでUtilモジュールをサーバーに入れればよいのですが、 「use Util;」はどのモジュールになるのかがわからず困っております。 試しに、yum list コマンドで Util が付いているパッケージを探し、yum install してみましたが解決されませんでした。 (yum -y install perl-Util-SelfDestruct.noarch など) ご存じな方がおられましたら、ご教示お願いします。 宜しくお願い致します。

  • パスがうまく通らない

    Check.pmが  o:\public_html/post_pervice/cgi/lib にあります。 このモジュールを利用するために以下のようなプログラムを書きました。   #! /usr/bin/perl -w   use CGI::Carp qw(fatalsToBrowser);   unshift @INC, "o:/public_html/post_service/cgi/lib";   print join "\n",@INC;   use Check; この中の  use Check; をコメントで伏せて動かすと、   o:/public_html/post_service/cgi/lib   O:/usr/site/lib   O:/usr/lib のような表示がなされるので、  unshift @INC, "o:/public_html/post_service/cgi/lib"; はちゃんと機能しているようです。 しかし  use Check; のコメントを外して動かすと、   Can't locate Check.pm in @INC (@INC contains: O:/usr/site/lib O:/usr/lib .) at O:\public_html\post_service\cgi\showINC.pl line 8.   BEGIN failed--compilation aborted at O:\public_html\post_service\cgi\showINC.pl line 8. のようなエラーが出てしまいます。 何がいけないのでしょう。

    • ベストアンサー
    • Perl
  • この記述というのは?

    CGIを設置しようと思うのですが、Perlを使用している場合で、   スクリプト内に以下の記述が含まれていることを確認して下さい。   print "Content-type: text/html\n\n"   もしくは、   Prelモジュール"CGI.pm"を参照する記述が含まれていることを   確認して下さい。   use CGI qw(:cgi-lib :standard);    print header(); という内容のことがマニュアルに記載されています。 この記述はどういう意味をもつものなのでしょうか? おそらく上の記述が含まれてないためにCGIが動かないのかなと思っています。含まれていない場合はどういった対処をすればよいのでしょうか?ご存知の方がいらっしゃいましたら宜しくお願い致します。

    • ベストアンサー
    • Perl
  • CGI::Carpを使っているのにInternal Server Error

    うまく動きません。コマンドラインでは作動するのですが、ブラウザではダメでした。  #! /usr/bin/perl -w  use Calendar::Simple;  use CGI::Carp qw(fatalsToBrowser);  use Data::Dumper;  use lib "/home/kojima/kojima00001/myperl/lib";  my @curr=calendar;  print Dumper(@curr); もっともその理由は分かりました。  use lib "/home/kojima/kojima00001/myperl/lib"; が  use Calendar::Simple; より後にあったことです。 さらに言うと、ブラウザで動かすためにはHTMLをサポートしていないといけませんが、このコードはHTMLをサポートしていません。 この2点を修正して、無事このプログラムはブラウザでもうまく動いたのですが、問題はうまく動いてくれていなかった時のブラウザの表示です。 Internal Sever Errorが出ていました。それじゃ何のことか分からなくて嫌だから  use CGI::Carp qw(fatalsToBrowser); と宣言してあるのです。 モノの本によると、この場合は  Software error:  Can't locate Calendar/Simple.pm in @INC (@INC containts: @INCに含まれるディレクトリがズラズラ・・・).  BEGIN failed--compilation aborted at calendar.cgi line3. というエラーメッセージが表示されるはず。 つまりCGI::Carpが機能していないことになります。 何故でしょう? お手数をお掛けします。

    • ベストアンサー
    • Perl
  • CGIからuse GDBM_Fileを宣言出来ない

    質問失礼します。 GDBMを用いたプログラムをperlで作ったのですが、 solarisのコマンドラインから打ち込むと普通に実行出来ます。 しかし、webブラウザからCGIでsystem関数を使い そのプログラムを呼び出すと実行出来ません。 どうやら use GDBM_File; の部分でエラーが起きているようです。 そこで、エラーログを見ると以下の記述がありました [Wed Jan 23 17:17:13 2008] [error] [client 157.80.85.160] Can't locate GDBM_file.pm in @INC (@INC contains: /usr/perl5/5.8.4/lib/sun4-solaris-64int /usr/perl5/5.8.4/lib /usr/perl5/site_perl/5.8.4/sun4-solaris-64int /usr/perl5/site_perl/5.8.4 /usr/perl5/site_perl /usr/perl5/vendor_perl/5.8.4/sun4-solaris-64int /usr/perl5/vendor_perl/5.8.4 /usr/perl5/vendor_perl .)~以下略 とにかく「Can't locate GDBM_file.pm ~」と書いてあるので 以下の文を「use GDBM_File;」の上に加えて、 探す場所を指定したのですが use lib '/opt/csw/lib/perl/5.8.8'; 今度は [Wed Jan 23 20:15:05 2008] [error] [client 157.80.85.160] Can't load '/opt/csw/lib/perl/5.8.8/auto/GDBM_File/GDBM_File.so' for module GDBM_File: ld.so.1: perl: fatal: relocation error: file /opt/csw/lib/perl/5.8.8/auto/GDBM_File/GDBM_File.so: symbol Perl_croak_nocontext: referenced symbol not found at /usr/perl5/5.8.4/lib/sun4-solaris-64int/XSLoader.pm line 68., ~以下略 と出てきて、実行されません パーミッションも「444」で読み込みは出来るようになっているはずです どなたかこのエラーの解決法がわかる方はいませんでしょうか? ご教授願います。

    • 締切済み
    • CGI
  • 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は同時に記述してはいけないのでしょうか? 同時に記述しないと目的のプログラムを実現する方法が大きく変わってきてしまうので、非常に困ってしまいます。 もし、ご存知の方がいらっしゃったら教えてください。 宜しくお願い致します。

  • YAMLについて

    perlの初心者の者です. 以下のようなサンプルソースを実行すると Can't locate auto/YAML/Syck/DumpYAML.al in @INC (@INC contains: C:/Perl/site/lib C:/Perl/lib .) at C:/Perl/site/lib/YAML/Syck.pm line 113 というエラーが出てしまってyaml.txtに当然実行結果が書き込まれていません.原因はなんでしょうか?

  • CGIエラー

    アクセス解析のCGIを設置しようとしてるのですが、動作確認の際に、以下のエラーが出ます。 The specified CGI application misbehaved by not returning a complete set of HTTP headers. The headers it did return are: Can't locate config.pl in @INC (@INC contains: C:/Perl/lib C:/Perl/site/lib .) at C:\daishin_www\cgi-bin\access\accview.cgi line 83. CGIを設置するのはこれが初めてなので、このエラー文が何を言いたいのか、どこを直せば動くようになるのか、ぜんぜんわからずに困っています。 どなたか教えて頂けませんか? サーバーは自社サーバーでWindowsです。

    • ベストアンサー
    • CGI

専門家に質問してみよう