我有这个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 模块插件1 $ VAR1 = \ undef;
如何使Main1中的方法和变量可用于Plug1?
答案 0 :(得分:1)
您可以将您的模块描述为Plugins::Plug1
,Plugins::Plug
,Plug1
和plug1
。您必须清楚它是什么,并且模块Plugins::Plug1
必须位于名为Plugins/Plug1.pm
的文件中,从语句package Plugins::Plug1
开始
目前还不清楚你的问题出了什么问题。应该发生的是Perl会告诉您Plugins::Plug1::devices
不存在,因为您的package
语句不匹配。但看起来你说Main::load_devices
正在返回undef
而不是哈希引用。
看起来可能正在调用子例程,您需要调试它们。在代码中添加一些print
语句以查看所调用的内容,但最重要的是,您必须在每个文件的顶部use strict
和use warnings
。这将揭示许多简单的错误。
另请注意,Exporter
将符号从模块导出到调用包中,如果您打算始终使用其完全限定名称调用子例程,则不需要。如果您使用Exporter
,则可以省略呼叫中的包名称
答案 1 :(得分:0)
Plugins::Plug1
必须声明它“是”Main
(提示:就像他们都声明他们与Exporter
有“是”关系一样。)。然后这些方法将立即可用。但是,如果您正在询问如何使变量对子类“可见”,则应阅读对象上的perldoc(以perlobj开头)。你不能和你不应该。
我认为你正在考虑标准的OO,包中的变量代表对象的成员。最常见的实现是祝福散列,其中成员在散列中被命名为值。