0

私はこのperlスクリプトを持っています

#!/usr/bin/perl

use lib "/home/gdanko/test/perl";
use Main;

Plugins::Plug1::devices;

モジュール Main は次のようになります

package Main;

use lib "/home/gdanko/test/perl";
use Plugins::Plug1;
use DBI;

@ISA = ('Exporter');
@EXPORT = qw();
@EXPORT_OK = qw($dbh &load_devices);

our $dbh = DBI->connect("dbi:SQLite:dbname=/home/gdanko/test/mydb.db", "", "");

sub load_devices {
    my $sth = $dbh->prepare("SELECT * FROM devices");
    $sth->execute;
    my $devices = $dbh->selectall_hashref($sth, "id");
    return $devices;
}
1;

モジュール Plug1 は次のようになります。

package Plug1;

use lib "/home/gdanko/test/perl";
use Data::Dumper;
use Main qw(&load_devices);

@ISA = ('Exporter');
@EXPORT = ();
@EXPORT_OK = qw(&devices);

sub devices {
    print "module plug1\n";
    my $devices = Main::load_devices;
    print Dumper(\$devices->{maguro});
}
1;

メイン スクリプトから Plugins::Plug::devices を実行すると、次のように返されます。

Main のメソッドと変数を Plug1 で使用できるようにするにはどうすればよいですか?

4

2 に答える 2

1

Plugins::Plug1モジュールを、、、およびとしてさまざまPlugins::Plugに記述します。それがどれであるかを明確にする必要があり、モジュールはステートメントで始まるという名前のファイルに含まれている必要がありますPlug1plug1Plugins::Plug1Plugins/Plug1.pmpackage Plugins::Plug1

何が悪いのかはあなたの質問からは明らかではありません。あなたのステートメントが一致しないので、 PerlはあなたPlugins::Plug1::devicesが存在しないと言うでしょう。しかし、ハッシュ参照の代わりにそれが戻ってきpackageていると言っているようです。Main::load_devicesundef

サブルーチンが呼び出されている可能性があり、デバッグする必要があります。コードにいくつかのprintステートメントを入れて、何が呼び出されているかを確認しますが、何よりも、すべてのファイルの先頭に配置する必要がuse strictあります。use warningsそれは多くの単純な間違いを明らかにするでしょう。

また、シンボルをモジュールから呼び出し元のパッケージにエクスポートすることにも注意してくださいExporter。完全修飾名を使用してサブルーチンを常に呼び出す場合は不要です。使用する場合Exporterは、呼び出しからパッケージ名を省略できます

于 2012-08-17T20:27:01.140 に答える
0

Plugins::Plug1それが「である」と宣言する必要がありますMain(ヒント:両方が「である」との関係があると宣言するのと同じようにExporter)。その後、メソッドはすぐに利用できるようになります。ただし、変数をサブクラスに「表示」する方法を尋ねる場合は、オブジェクトのperldoc( perlobjで始まる)を読む必要があります。あなたはできませんし、すべきではありません

私はあなたが標準のOOを考えていると思います、そしてパッケージの変数はオブジェクトのメンバーを表します。最も一般的な実装は祝福されたハッシュであり、メンバーはハッシュ内の値に名前が付けられます。

于 2012-08-17T19:33:21.613 に答える