Como faço para criar uma classe Perl?

Estou escrevendo classes Perl para remover redundâncias de scripts e como Perl tem um monte de maneiras de fazer classes eu continuo tendo problemas para fazer as classes corretamente. Alguém tem um exemplo de boa prática de uma aula?

A maior questão que tenho é se não deve haver variáveis globais num módulo como é que se usa variáveis através de sub() num módulo? Como Java self - >foo = 10;

basicamente dá-me uma aula escrita em Java ou C# ou mesmo C++ e escreve o o mesmo em Perl. Também pontos extras para mostrar como fazer as variáveis de classe privada, protegida e pública corretamente. Herança e interfaces seriam úteis, acho eu.

 16
Author: brian d foy, 2009-06-24

4 answers

Uma maneira típica de criar objetos Perl é 'abençoar' uma hashref. A instância do objeto pode então armazenar dados contra o seu próprio conjunto de chaves de hash.

package SampleObject;

use strict;
use warnings;

sub new {
    my ($class, %args) = @_;
    return bless { %args }, $class;
}

sub sample_method {
    my ($self) = @_;
    print $self->{sample_data};
}

E utilização:

my $obj = SampleObject->new( sample_data => 'hello world',
                             more_data   => 'blah blah blah' );
$obj->sample_method();

Em alternativa, podem ser adicionados métodos de accessor/mutador (ver Classe::Accessor, Classe::Accessor::acorrentado, etc para facilitar a configuração destes) - estes tornam mais fácil validar os dados e adicionar encapsulação (não é aplicada em Perl, você tem que garantir que o seu código não circula por um apropriado acessor/mutador e acessar os dados na hashref abençoada diretamente).

 27
Author: plusplus, 2013-06-17 14:34:03
Bem, o Perl é fácil, mas estou enferrujado nas outras línguas, por isso vou actualizá-los daqui a pouco. Aqui está uma classe Perl simples:
#!/usr/bin/perl

package Person;

use strict;
use warnings;
use Carp;

sub new {
    my $class = shift;
    my $self  = { @_ };
    croak "bad arguments" unless defined $self->{firstname} and defined $self->{lastname}; 
    return bless $self, $class; #this is what makes a reference into an object
}

sub name {
    my $self = shift;
    return "$self->{firstname} $self->{lastname}";
}

#and here is some code that uses it
package main;

my $person = Person->new(firstname => "Chas.", lastname => "Owens");
print $person->name, "\n";

Aqui está a mesma classe escrita com os novos objectos de estilo Moose:

#!/usr/bin/perl

package Person;

use Moose; #does use strict; use warnings; for you

has firstname => ( is => 'rw', isa => 'Str', required => 1 );
has lastname  => ( is => 'rw', isa => 'Str', required => 1 );

sub name {
    my $self = shift;
    return $self->firstname . " " . $self->lastname;
}

#and here is some code that uses it
package main;

my $person = Person->new(firstname => "Chas.", lastname => "Owens");
print $person->name, "\n";

E MooseX::Declare remove a necessidade de ainda mais código e faz com que as coisas pareçam bonitas:

#!/usr/bin/perl

use MooseX::Declare;

class Person {
    has firstname => ( is => 'rw', isa => 'Str', required => 1 );
    has lastname  => ( is => 'rw', isa => 'Str', required => 1 );

    method name {
            return $self->firstname . " " . $self->lastname;
    }
}

#and here is some code that uses it
package main;

my $person = Person->new(firstname => "Chas.", lastname => "Owens");
print $person->name, "\n";
Uma nota rápida, estas duas classes são as duas primeiras classes de alces que já escrevi. E aqui está um código C++ muito enferrujado (não se corte nele ou você vai precisar de uma vacina contra o tétano):
#include <stdio.h>
#include <string.h>

class Person {
    char* firstname;
    char* lastname;

    public:
    Person(char* first, char* last) {
        firstname = first;
        lastname  = last;
    }

    char* name(void) {
        int len = strlen(firstname) + strlen(lastname) + 1;
        char* name = new char[len];
        name[0] = '\0';
        strcat(name, firstname);
        strcat(name, " ");
        strcat(name, lastname);
        return name;
    }
};

int main(void) {
    Person* p    = new Person("Chas.", "Owens");
    char*   name = p->name();
    printf("%s\n", name);
    delete name;
    delete p;
    return 0;
}
 23
Author: Chas. Owens, 2009-06-24 17:37:18

ConfiraMoose , que é uma extensão do sistema de objetos Perl 5.

O seguinte vai ajudá-lo a aprender Alce:

 16
Author: Alan Haggai Alavi, 2009-06-24 09:51:55

Além do Alce, que as pessoas já mencionaram...

Se está apenas a falar de classes (portanto, não de objectos), normalmente cria dados de classes com variáveis lexicais escopadas para o ficheiro e usa uma classe por ficheiro. Você cria métodos de Acesso para lidar com eles. Há várias maneiras de lidar com isso.

No entanto, parece que você precisa começar com algo como intermediário Perl ou objeto orientado de Damian Conway Perl . Há demasiado. para explicar para qualquer um ter tempo para reproduzir tudo isso em uma resposta Stackoverflow.

 4
Author: brian d foy, 2009-06-24 18:09:49