Включить файл класса Perl - PullRequest
       16

Включить файл класса Perl

1 голос
/ 04 апреля 2011

У меня есть файл класса Perl (пакет): person.pl

package person;

sub create {
  my $this = {  
    name => undef,
    email => undef
  }

  bless $this;
  return $this;
}  

1;

и мне нужно использовать этот класс в другом файле: test.pl

(обратите внимание, что person.pl и test.pl находятся в одном каталоге)

require "person.pl";

$john_doe = person::create();
$john_doe->{name} = "John Doe";
$john_doe->{email} = "johndoe@example.com";

но оно не увенчалось успехом.

Я использую XAMPP для запуска PHP и Perl.

Я думаю, что не правильно использовать «требовать», чтобы получить код класса «человек», но я не знаю, как решить эту проблему. Пожалуйста, помогите ...

Ответы [ 2 ]

12 голосов
/ 04 апреля 2011

Прежде всего, вы должны назвать файл person.pm (для модуля Perl). Затем вы можете загрузить его с помощью функции use :

use person;

Если каталог, в котором находится person.pm, находится не в @INC, вы можете использовать прагму lib , чтобы добавить его:

use lib 'c:/some_path_to_source_dir';
use person;

Во-вторых, Perl не имеет специального синтаксиса для конструкторов. Вы назвали свой конструктор create (что нормально, но нестандартно), но затем попытались вызвать person::new, которого не существует.

Если вы собираетесь заниматься объектно-ориентированным программированием на Perl, вам действительно стоит взглянуть на Moose . Помимо всего прочего, он создает конструктор для вас.

Если вы не хотите использовать Moose, вот некоторые другие улучшения, которые вы можете сделать:

package person;

use strict;   # These 2 lines will help catch a **lot** of mistakes
use warnings; # you might make.  Always use them.

sub new {            # Use the common name
  my $class = shift; # To allow subclassing

  my $this = {  
    name => undef;
    email => undef;
  }

  bless $this, $class; # To allow subclassing
  return $this;
}

Затем вызовите конструктор как метод класса:

use strict;   # Use strict and warnings in your main program too!
use warnings;
use person;

my $john_doe = person->new();

Примечание: в Perl чаще используется $self, чем $this, но это на самом деле не имеет значения. Встроенная объектная система Perl очень минимальна и накладывает несколько ограничений на то, как вы ее используете.

0 голосов
/ 04 апреля 2011

Я нашел решение для моей проблемы загрузки исходных файлов Perl из другого файла Perl в том же каталоге.Обычно вы должны:

use lib "c:/some_dir_path";
use class_name;

Приведенное ниже решение лучше, когда исходный код модуля находится в стадии разработки, поскольку он перезагружает модуль в кеше Perl.Он обеспечивает перезагрузку исходного кода класса каждый раз, когда это требуется, а это означает, что любое изменение исходного кода файла, который будет включен, будет действовать каждый раз, когда файл включается в компиляцию или во время выполнения:

push (@INC,"c:/some_path_to_source_dir"); #directory contains perl source files

delete @INC{"class1.pl"}; #to reload class1
require "class1.pl";

delete @INC{"class2.pl"}; #to reload class2
require "class2.pl";

delete @INC{"class3.pl"}; #to reload class3
require "class3.pl";

Не знаю, хороший ли это способ, поправьте меня.

...