包含Perl类文件

时间:2011-04-04 06:33:24

标签: perl oop class include require

我有一个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 个答案:

答案 0 :(得分:12)

首先,您应该将文件命名为person.pm(对于Perl模块)。然后您可以使用use函数加载它:

use person;

如果person.pm所在的目录不在@INC中,您可以使用lib pragma添加它:

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的内置对象系统非常小,对您的使用方式几乎没有限制。

答案 1 :(得分:0)

我找到了解决我从同一目录中的另一个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";

我不知道这是不是一个好方法,请纠正我。