Наследование работает над объектами. То, что вы пытаетесь сделать, это импортировать, а не наследовать. Я изложил пример наследования и импорта ниже.
Наследование:
One.pm
:
package One;
sub foo {
print "this is one\n";
}
1;
Two.pm
:
package Two;
# Note the use of 'use base ...;'. That means that we'll inherit
# all functions from the package we're calling it on. We can override
# any inherited methods by re-defining them if we need/want
use base 'One';
sub new {
return bless {}, shift;
}
1;
inherit.pl
:
use warnings;
use strict;
use Two;
my $obj = Two->new;
$obj->foo;
Импорт:
One.pm
:
package One;
use Exporter qw(import);
our @EXPORT_OK = qw(foo); # allow user to import the 'foo' function if desired
sub foo {
print "this is one\n";
}
1;
Two.pm
:
package Two;
use One qw(foo); # import foo() from One
use Exporter qw(import);
our @EXPORT_OK = qw(foo); # re-export it so users of Two can import it
1;
import.pl
:
use warnings;
use strict;
use Two qw(foo);
foo();
Обратите внимание, что в следующем Perl версии (5,26.0), @INC
не будет включать текущий рабочий каталог по умолчанию, поэтому до use One;
или use Two;
, если эти файлы модулей находятся в локальном каталоге, вам нужно будет добавить use lib '.';
или unshift @INC, '.';
или тому подобное.
Возможный дубликат [Как создается Perl @INC? (ака Какие способы повлиять на поиск модулей Perl?)] (http://stackoverflow.com/questions/2526804/how-is-perls-inc-constructed-aka-what-are-all-the -ways-of-impacting-where-pe) – dubes
@dubes Я не согласен с этой оценкой. – simbabque