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 时,我得到以下回报: gdanko@apollo:~/test$ ./script.pl module plug1 $VAR1 = \undef;

如何使 Main 中的方法和变量可用于 Plug1?

4

2 回答 2

1

您将模块描述为Plugins::Plug1Plugins::Plug和。您必须清楚它是什么,并且模块必须位于以语句开头的文件中Plug1plug1Plugins::Plug1Plugins/Plug1.pmpackage Plugins::Plug1

从您的问题中不清楚出了什么问题。应该发生的是 Perl 会告诉你Plugins::Plug1::devices不存在,因为你的package陈述不匹配。但看起来你说的Main::load_devices是返回undef而不是哈希引用。

看起来可能正在调用子例程,您需要调试它们。在您的代码中添加一些print语句以查看被调用的内容,但最重要的是您必须在每个文件use strictuse warnings顶部放置。这将揭示许多简单的错误。

另请注意,Exporter将模块中的符号导出到调用包中,如果您打算始终使用其完全限定名称调用子例程,则没有必要这样做。如果您使用Exporter,您可以在调用中省略包名称

于 2012-08-17T20:27:01.140 回答
0

Plugins::Plug1必须声明它“是一个” Main(提示:就像他们都声明他们与 . 有一个“是一个”关系Exporter)。然后这些方法将立即可用。但是,如果您询问如何使变量对子类“可见” ,则应阅读有关对象的 perldoc(以perlobj 开头)。你不能也不应该

我认为您正在考虑标准 OO,并且包中的变量代表对象的成员。最常见的实现是祝福散列,其中成员是散列中的命名值。

于 2012-08-17T19:33:21.613 回答