Я нашел решение
Мне пришлось удалить файл .HTACCESS на моем сервере. Этот файл содержит этот код:
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
URL-адрес удерживается в «http //»
C++ mechnics очень не отличается, чем механика Perl: Для использования наследования Вам нужны два класса: базовый класс и наследующий класс. Но у Вас нет происходящего класса.
Вы также испытываете недостаток в конструкторе. В отличие от C++, Perl не предоставит конструктора по умолчанию Вам.
Ваш базовый класс содержит ошибку неверного синтаксиса, таким образом, я предполагаю, что Вы не попробовали код перед регистрацией.
Наконец, как tsee уже наблюдаемый, необходимо будет сообщить Perl, хотите ли Вы вызов функции или вызов метода.
То, что Вы действительно хотите, выглядело бы примерно так:
my $foo = TestDescendent->new();
$foo->main();
package TestBase;
sub new {
my $class = shift;
return bless {}, $class;
}
sub tbSub
{
my ($self, $parm) = @_;
print "\nTestBase: $parm\n";
}
package TestDescendent;
use base 'TestBase';
sub main {
my $self = shift;
$self->mySub( 1 );
$self->tbSub( 2 );
$self->mySub( 3 );
}
sub mySub
{
my $self = shift;
my $parm = shift;
print "\nTester: $parm\n";
}
1;
Необходимо взглянуть на использование Американского лося, который является постмодернистской объектной системой для Perl5. Вы, вероятно, найдете намного легче схватить, чем использование стандартного Perl семантику OO... особенно при прибытии из другого языка OO.
Вот версия Американского лося Вашего вопроса....
package TestBase;
use Moose;
sub tbSub {
my ($self, $parm) = @_;
print "\nTestBase: $parm\n";
}
package TestDescendent;
use Moose;
extends 'TestBase';
sub main {
my $self = shift;
$self->mySub( 1 );
$self->tbSub( 2 );
$self->mySub( 3 );
}
sub mySub {
my ($self, $parm) = @_;
print "\nTester: $parm\n";
}
package main;
my $foo = TestDescendent->new();
$foo->main
Различия....
Таким образом, этот пример только покрывает подсказку айсберга Американского лося ;-)
Как заметка на полях, существует мало серьезного основания к use base
вместо более нового use parent
.
Синтаксис OO использует ->
оператор для разделения сообщения и аргументов от получателя сообщения. Короткая иллюстрация ниже.
You->do_something( @params );
OR
$you->do_something( @params );
package A;
sub do_neat_thing {
my ( $class_or_instance, @args ) = @_;
my $class = ref( $class_or_instance );
if ( $class ) {
say "Instance of '$class' does a neat thing.";
}
else {
say "$class_or_instance does a neat thing.";
}
}
...
package main;
A->do_neat_thing(); # A does a neat thing.
my $a_obj = A->new();
$a_obj->do_neat_thing(); # Instance of 'A' does a neat thing.
Наследование Perl наследовало методы, не функции. Это означает, что необходимо будет звонить
main->tbSub(2);
Однако то, что Вы действительно хотите, должно наследовать метод в надлежащий класс:
package Derived;
use base "TestBase";
package main;
Derived->somemethod("foo");
Вызывающие методы в текущем пакете как функции не передадут в $self или "этом" объекте, ни имени класса волшебно. Внутренне,
Class->somemethod("foo")
по существу заканчивает тем, что был назван как
Class::somemethod("Class", "foo")
внутренне. Конечно, это предполагает, что Класс имеет подпрограмму/метод, названную "somemethod". В противном случае суперклассы Класса будут проверены и если у этого не будет метода "somemethod" также, то Вы получите фатальную ошибку. (Та же логика запрашивает $obj-> метод ("нечто").)
Это кажется мне, Вы перепутываете две вещи здесь: объектно-ориентированный и Процедурный Perl. Perl OO довольно "отличается" (как в не господствующая тенденция, но осуществимый).
Ваш модуль TestBase.pm, кажется, ожидает быть выполненным как объект Perl (oo-стиль Perl), но Ваш сценарий Perl хочет получить доступ к нему как к "нормальному" модулю. Perl не работает способ, которым C++ делает (как Вы поняли), таким образом, необходимо будет создать код по-другому. См. книги Damian Conway для объяснений (и более умный код, чем мои ниже).
Процедурный:
#! /usr/bin/perl
#The module to inherit from
package TestBase;
use strict;
use warnings;
use Exporter ();
our @ISA = qw (Exporter);
our @EXPORT = qw (tbSub);
#-------------------------------
sub tbSub
{
my ($parm) = @_;
print "\nTestBase: $parm\n";
}
1;
.
#! /usr/bin/perl
#The descendent class
use strict;
use warnings;
use TestBase;
sub main;
sub mySub;
#-------------------------------
#Entry point...
main();
#---code------------------------
sub main
{
mySub(1);
tbSub(2);
mySub(3);
}
#-------------------------------
sub mySub
{
my $parm = shift;
print "\nTester: $parm\n";
}
Perl OO
#! /usr/bin/perl
#The base class to inherit from
package TestBase;
use strict;
use warnings;
#-------------------------------
sub new { my $s={ };
return bless $s;
}
sub tbSub
{
my ($self,$parm) = @_;
print "\nTestBase: $parm\n";
}
1;
.
#! /usr/bin/perl
#The descendent class
use strict;
use warnings;
use TestBase;
sub main;
sub mySub;
#-------------------------------
#Entry point...
main();
#---code------------------------
sub main
{
my $tb = TestBase->new();
mySub(1);
$tb->tbSub(2);
mySub(3);
}
#-------------------------------
sub mySub
{
my $parm = shift;
print "\nTester: $parm\n";
}