Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl类使用其父类的方法_Perl_Class_Inheritance - Fatal编程技术网

Perl类使用其父类的方法

Perl类使用其父类的方法,perl,class,inheritance,Perl,Class,Inheritance,我有这个perl脚本 #!/usr/bin/perl use lib "/home/gdanko/test/perl"; use Main; Plugins::Plug1::devices; 主模块如下所示 package Main; use lib "/home/gdanko/test/perl"; use Plugins::Plug1; use DBI; @ISA = ('Exporter'); @EXPORT = qw(); @EXPORT_OK = qw($dbh &l

我有这个perl脚本

#!/usr/bin/perl

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

Plugins::Plug1::devices;
主模块如下所示

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;
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;
模块Plug1如下所示

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;
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=\undf


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

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


我认为您认为是标准OO,包中的变量表示对象的成员。最常见的实现是hash,其中成员是hash中的命名值

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

你的问题不清楚出了什么问题。应该发生的是,Perl将告诉您
Plugins::Plug1::devices
不存在,因为您的
package
语句不匹配。但您似乎在说,
Main::load_devices
返回的是
unde
,而不是散列引用

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


还请注意,
Exporter
将符号从模块导出到调用包中,如果您希望始终使用其完全限定名调用子例程,则不需要这样做。如果使用
Exporter
可以从调用中省略包名

我希望子类Plug1能够使用Main中“使用”它的方法。继承在这里是无关的,因为包不是类,子例程也不是方法-它们是不同命名空间中的简单包子例程。对于这样的完全限定的子例程调用,除了被调用的子例程必须已经编译之外,根本不需要设置任何内容beforehand@Borodin在关于“类”、“方法”和“父”的问题上,继承并不是无关紧要的。代码只是表明询问者对Perl OO知之甚少。@Axeman:尽管主题行,但问题与面向对象编程无关。如果你认为问题是错的,而主题是对的,那么我们就几乎没有什么可担心的了answer@Borodin,除了一些关于如何在Perl中完成继承和对象的指针<代码>*插件::插件1::{keys%Main::}=value%Main::也会回答他的问题,但不会帮助他识别示例代码与问题和标记所指示的思考方式之间的差异。