我有一个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。
我认为使用“要求”似乎并不正确 类'人'的代码,但我不知道 如何解决这个问题。请帮忙......
答案 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";
我不知道这是不是一个好方法,请纠正我。