我正在阅读一本perl书,但只看到了sub
关键字的功能示例。
是否有一个例子来定义和使用我自己的类?
如何将下面的PHP重写为perl?
class name {
function meth() {
echo 'Hello World';
}
}
$inst = new name;
$inst->meth();
答案 0 :(得分:14)
基本perl方式是:
在'Foo.pm'文件中:
use strict;
use warnings;
package Foo;
sub new {
my $class = shift;
my $self = bless {}, $class;
my %args = @_;
$self->{_message} = $args{message};
# do something with arguments to new()
return $self;
}
sub message {
my $self = shift;
return $self->{_message};
}
sub hello {
my $self = shift;
print $self->message(), "\n";
}
1;
在你的剧本中:
use Foo;
my $foo = Foo->new(message => "Hello world");
$foo->hello();
你可能更喜欢使用Moose,在这种情况下文件'Foo.pm'是:
package Foo;
use Moose;
has message => (is => 'rw', isa => 'Str');
sub hello {
my $self = shift;
print $self->message, "\n";
}
1;
因为Moose为您制作了所有的访问器。你的主文件完全一样......
或者你可以使用Moose扩展来使一切变得更漂亮,在这种情况下,Foo.pm变为:
package Foo;
use Moose;
use MooseX::Method::Signatures;
has message => (is => 'rw', isa => 'Str');
method hello() {
print $self->message, "\n";
}
1;
答案 1 :(得分:8)
Modern Perl是一本优秀的书,免费提供,其中有关于使用Moose编写OO Perl的详尽章节。 (从PDF版本的第110页开始。)
答案 2 :(得分:7)
我会从perlboot man page开始。
答案 3 :(得分:5)
我发现这是一个更简约的版本:
package HelloWorld;
sub new
{
my $class = shift;
my $self = { };
bless $self, $class;
return $self;
}
sub print
{
print "Hello World!\n";
}
package main;
$hw = HelloWorld->new();
$hw->print();
进一步分叉的人
答案 4 :(得分:3)
由Sukima发布的示例,但使用MooseX::Declare实现(没有源过滤器!)Moose的更具声明性的语法。它与Perl将要获得的OP给出的示例差不多。
#!/usr/bin/env perl
use MooseX::Declare;
class HelloWorld {
method print () {
print "Hello World!\n";
}
}
no MooseX::Declare;
my $hw = HelloWorld->new;
$hw->print;
一个稍微复杂的例子显示了Moose / MooseX :: Declare语法的全部功能:
#!/usr/bin/env perl
use MooseX::Declare;
class HelloWorld {
has 'times' => (isa => 'Num', is => 'rw', default => 0);
method print (Str $name?) {
$name //= "World"; #/ highlight fix
print "Hello $name!\n";
$self->times(1 + $self->times);
}
}
no MooseX::Declare;
my $hw = HelloWorld->new;
$hw->print;
$hw->print("Joel");
print "Called " . $hw->times . " times\n";