很抱歉打扰社区,但不幸的是我在Perl中编写代码:'(。这是关于我想要理解的OO perl代码,但我没有将所有部分放在一起。
以下是代码模板,它代表了我目前正在看的内容。以下是 MyClass 类
package Namespace::MyClass;
sub new($)
{
my ($class) = @_;
$self = { };
bless ($self, $class);
}
sub init($$)
{
my ($self, $param1) = @_;
$self->{whatever} = ($param1, $param1, $param1);
}
然后以下是应该使用该类的 script.pl :
#!/path/to/your/perl
require Namespace::MyClass;
my myClass = new Namespace::MyClass()
myClass->init("data_for_param1");
可能有错误,但我更感兴趣的是回答了以下问题,而不是纠正错误代码:
我问这个是因为我在非祝福模块中看到一个$ =一个参数。
感谢您的时间。
答案 0 :(得分:6)
原型(例如" $")在Method调用中意味着完全没有。
最有经验的Perl民众完全避免使用原型,除非他们试图模仿内置功能。一些PHBs没有经验的Perl强制要求他们使用它们的错误观念,即它们就像其他语言的原型一样。
Method调用的第一个参数是调用Method的Object(Blessed Ref)或Class Name(String)。如果您的new
方法属于' Namespace :: MyClass'。
Word to the wise:Also avoid indirect Method calls.使用直接方法调用重写您的行,如下所示:my $myClass = Namespace::MyClass->new;
您的init
方法获得了$myClass
作为第一个参数,因为它被称为''方法。第二个参数来自参数列表。祝福将类的名称绑定到引用,以便在看到方法调用时,它知道在哪个类中开始搜索正确的sub
。如果未立即找到正确的sub
,则会继续搜索类@ISA
数组中指定的类。
答案 1 :(得分:2)
Don't use prototypes!他们不做你认为他们做的事。
Perl中的原型主要用于允许在不使用括号的情况下定义函数,或者允许使用数组引用的函数使用像pop
或push
这样的数组名称。否则,原型可能会导致比大多数肥皂剧角色更多的麻烦和心碎。
答案 2 :(得分:0)
你真的想要验证参数吗?如果是这样那么这不是原型的目的。您可以尝试使用signatures,但出于某种原因,它们是新的,仍然是实验性的。有人认为缺乏稳定的签名功能是perl的一个缺陷。替代方案是CPAN并在您的subs /方法中编写明确验证params的代码。