Perl类使用其父级的方法

时间:2012-08-17 19:20:40

标签: perl class inheritance

我有这个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?

2 个答案:

答案 0 :(得分:1)

您可以将您的模块描述为Plugins::Plug1Plugins::PlugPlug1plug1。您必须清楚它是什么,并且模块Plugins::Plug1必须位于名为Plugins/Plug1.pm的文件中,从语句package Plugins::Plug1开始

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

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

另请注意,Exporter将符号从模块导出到调用包中,如果您打算始终使用其完全限定名称调用子例程,则不需要。如果您使用Exporter,则可以省略呼叫中的包名称

答案 1 :(得分:0)

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

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