[SP-pm] Data Serializer

Luis Motta Campos luismottacampos at yahoo.co.uk
Thu Jul 31 14:27:31 PDT 2008


Vi wrote:
> S.O: usamos FreeBsd
> Perl: Usamos a versão 5.8.8
> Data::Serializer 0.46

Vi, você parece não saber nada mesmo de Per. Eu recomendo que você leia 
o seguintes documentos:

perlintro           Perl introduction for beginners
perlreftut          Perl references short introduction
perldsc             Perl data structures intro
perllol             Perl data structures: arrays of arrays
perlboot            Perl OO tutorial for beginners
perltoot            Perl OO tutorial, part 1
perltooc            Perl OO tutorial, part 2
perlbot             Perl OO tricks and examples
perlstyle           Perl style guide
perlcheat           Perl cheat sheet

Todos eles podem ser acessados a partir do shell do seu computador, 
assumindo que você tem uma instalação completa de um Perl 5.8.8. Para 
exibir a documentação, use o comando "perldoc" e passe como argumento o 
nome do documento que você quer ler. Por exemplo, para ler a introdução, 
diga

perldoc perlintro

No shell do seu BSD.

> esse eh o código:
[corta]
> Como jah disse antes, sou iniciante em Perl, portanto nao sei se a parte do
> Pacote esta correta (peguei hj um tutorial que explica como funciona OO em
> perl)!

Leia os documentos acima. Eles são o melhor e mais compacto guia para OO 
em Perl.

> E tambem nao sei se esta certo usar o mesmo script para a classe(pacote) e
> para a serializacao!

Mais ou menos. Serve bem para um estudo, mas você deveria organizar 
melhor os teus fontes, colocando um pacote por arquivo, no máximo.

> Sei lah talvez se separar a classe da serializacao e chamar a classe no
> script onde ocorrera a serializacao funcionaria!?!?!?!!

Esta é a forma correta.

> E como eu passo o objeto a ser serializado?

Por referência, para a função "serialize". Olhe o meu exemplo, abaixo, e 
espero que você tenha idéias. Ele tem montes de coisas extras para você 
perguntar, por isso não se acanhe. ;)

> E esses são os erros:
> Global symbol "$this" requires explicit package name at serialz.pl line 13.
> Global symbol "$atrb" requires explicit package name at serialz.pl line 15.
> Global symbol "$this" requires explicit package name at serialz.pl line 20.
> Global symbol "$atrb" requires explicit package name at serialz.pl line 20.
> Global symbol "$obj" requires explicit package name at serialz.pl line 25.
> Global symbol "$serialized" requires explicit package name at serialz.pl
> line 33.
> Global symbol "$obj" requires explicit package name at serialz.pl line 33.
> Global symbol "$deserialized" requires explicit package name at serialz.pl
> line 34.
> Global symbol "$obj" requires explicit package name at serialz.pl line 34.
> Global symbol "$serialized" requires explicit package name at serialz.pl
> line 34.
> Global symbol "$deserialized" requires explicit package name at serialz.pl
> line 35.

Todos os seus erros podem ser explicados com o uso do pragma "diagnostics":

perl -wc -Mdiagnostics seu_script.pl

vai te explicar o motivo destes erros. Uma dica: eles não tem nada a ver 
com serialização de dados, é uma coisa muito mais básica que isso.

Também recomendo a você ler

perldoc strict
perldoc warnings
perldoc diagnostics

por alto, para ajudar você a entender a mecânica de warnings e erros do 
Perl.

Meu Exemplo:

###
#!perl

# "pacotes" (package) ou classes em perl são a mesma coisa
package Data::Object;
use strict;
use warnings;

# O módulo de serialização que você quer usar
use Data::Serializer;

# Constroi métodos de acesso
use base 'Class::Accessor::Fast';

# A mesma coisa que __PACKAGE__, mas para OO
use CLASS;

# Isto constrói funções de acesso
CLASS->mk_accessors(qw( nome sobrenome telefone ));

# Construtor
sub new {
     my ( $class, %data ) = @_;

     # "bless" vincula o objeto com a classe, muito importante
     return bless \%data, $class;
}

1; # todo pacote tem de retornar um valor positivo no final

# Note que eu declarei "package main" apenas por que comecei
# a escrever código para outro pacote, acima. Você pode
# evitar isso colocando pacotes em arquivos separados.
# Declarar o pacote "main" é totalmente opcional, se ele é
# o único que está no arquivo.
package main;
use strict;
use warnings;

my $data_masher = Data::Serializer->new;

my $data = Data::Object->new( nome => 'Luis', sobrenome => 'Motta' );

print "Object name: " . $data->nome . ".\n";
print "Object surname: " . $data->sobrenome . ".\n";
print "Serialized version: " . $data_masher->serialize( $data ) . ".\n";

__END__

Espero que isso ajude.
Putamplexos!
-- 
Luis Motta Campos is a software engineer,
Perl Programmer, foodie and photographer.


More information about the SaoPaulo-pm mailing list