![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?5a7ff87)
エラーでハマっている為、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 …
抜粋「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/...
となってしまい、どうすればよいか途方にくれています。
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
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();#呼び出し可能
何度も読み直し調べ直し、理解するのに多少時間を要しましたが、この度は色々と分かり易いご解説、本当にありがとうございました。
No.2
- 回答日時:
Foo.pm 内でAutoLoaderをuseしているので、test.pl では、FooだけuseすればOKです。
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
ourする必要があったんですね。
後、オートロードさせたいFoo.pmモジュールもUPする必要がある事と(必要ないのかな・・と思ってた事と文字化けに苦しみ、モジュール化とオートロード等この辺りが初めての取り組みでしたので、頭の中で整理できていませんでした)
ご教授頂いた
test.pl内で
use Foo qw(function1);
しておけば、無理に
test.pl内で
use AutoLoaderして自分で関数作る必要もなかったって事だったんですね。恐れ入ります。
メインのtest.plで
use AutoLoaderしないのは、
mod_perlの場合などでは何でもかんでもオートロードしてしまう為、よくないという話をどこかで拝見したのですが、その事につながる為って事なのでしょうか・・
もし、何かご助言頂けるようでしたらお願いしたいのですけれども
いずれにしても、お陰様で無事動かすことができました!
ありがとうございます
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Perl Perl の外部モジュールの利用方法 3 2022/07/10 18:34
- その他(プログラミング・Web制作) laravel 本番環境でメールが送れません。 1 2023/02/17 17:57
- WordPress(ワードプレス) ワードプレスのエラー ログイン画面が表示できない 1 2022/11/05 09:51
- MySQL 何にかが違うから エラーなんでしょうね! 2 2022/09/18 05:28
- JavaScript 初心者です。gulpでコンパイルができないので教えてください! 1 2023/05/17 17:07
- Visual Basic(VBA) VBAでfunctionを利用しようとしたときに「引数は省略できません」というエラーが出ます 1 2022/10/15 16:30
- Perl Perlのエラーについてご教授ください。初心者です。 CGIを別サーバに移したところ、Perlのバー 5 2023/05/31 10:48
- UNIX・Linux AWSのEC2のZabbixユーザーでawscliコマンドが実行できない状態を解決する 1 2022/12/06 22:17
- MySQL 参考書に従って入力したつもりでしたが、最後はエラーがでました。 1 2022/09/28 03:45
- Excel(エクセル) エクセルVBAでオブジェクトが必要です 2 2022/09/10 16:37
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
LCD ディスプレイを Raspberry ...
-
PerlでHashのキーを制限したい
-
例外処理のフローチャートの記...
-
'Range'メソッドは失敗しました
-
Excel VBAでリンク切れをチェッ...
-
標準モジュールを削除したい。(...
-
グラフのX,Y座標を取得したい
-
Cからシェルを起動し返り値をハ...
-
【vba】フォームに書いてあ...
-
VBAで別モジュールへの変数の受...
-
Excel VBAで、ユーザーフォーム...
-
VBA This Workbookモジュール...
-
VBでグローバル変数を宣言するには
-
教えて下さい。
-
ベースモジュールって?
-
VBAProjectのモジュ...
-
acwzlibとは?
-
モジュールとクラスの違いって...
-
ユーザー定義関数に#NAME?が返...
-
モジュールとは何ですか
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
LCD ディスプレイを Raspberry ...
-
laravel 本番環境でメールが送...
-
Perlで画像のサイズ取得する方法
-
CGI::Carpを使っているのにInte...
-
MySQLとの接続でfetchrow_array...
-
(Perl CPAN) DBDがはいらない
-
perlからDBIを使用したpostgres...
-
failed: Can't connect to loca...
-
エラーでハマっている為、use A...
-
htmlフォームから受け取ったフ...
-
フォームメール@PerlとActiveP...
-
警告を消したい
-
Chart::Gnuplotの使い方
-
"use CGI::Session"でエラーが...
-
Unicode::Japanese を継承できない
-
例外処理のフローチャートの記...
-
Excel VBAでリンク切れをチェッ...
-
エクセルVBAでシートモジュール...
-
「デバイスは PRN を初期化でき...
-
VBAで別モジュールへの変数の受...
おすすめ情報