你好世界在Perl中的OOP示例?

时间:2011-06-19 03:23:28

标签: perl

我正在阅读一本perl书,但只看到了sub关键字的功能示例。

是否有一个例子来定义和使用我自己的类?

如何将下面的PHP重写为perl?

class name {

   function meth() {
     echo 'Hello World';
   }
}

$inst = new name;
$inst->meth();

5 个答案:

答案 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开始。

从那里,您可以转到perltootperltoocperlbot ......

答案 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();

对于任何希望在https://gist.github.com/1033749

进一步分叉的人

答案 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";