[Cascavel-pm] Res: "Subroutine new redefined at"

Daniel ® Antunes danielrantunes em yahoo.com.br
Terça Julho 10 13:00:24 PDT 2007


    Oi Alceu, valeu mesmo pela dica, vou aderir a esta prática de usar o método de forma direta.
    Eu já tinha feito a tentativa usando "$obj=Inquiry->new();", como a resposta foi a mesma eu voltei para a forma indireta. No entanto, eu acabei conseguindo eliminar a warning, não sei se foi da maneira correta, porém, funcionou. Inclusive já postei mensagem falando a respeito :
    Eu estava adicionando o método "new" no @EXPORT dos packages, qdo tirei ele parou de reclamar, seguem códigos defeituosos e o que ficou funcionando :
    
package Inquiry;
require Exporter;
use vars qw(@ISA @EXPORT);
use XML::Simple;
use Supplier::X;
@ISA=qw(Exporter);
@EXPORT=qw(new);
sub new{
    my $self={};
    $self->{suppliers}=();
    $self->{xmlRequest}="";
    $self->{parsedRequest}=();
    $self->{xmlResponse}="";
    return (bless $self);
}

    o outro package :

package Supplier::X;
require Exporter;
use vars qw(@ISA @EXPORT);
use constant SELFCODE => 2;
@ISA=qw(Exporter);
@EXPORT=qw(new);
sub new{
    my $self={};
    # Getting day's password
    my $dbh=bdData::mysqlConnect();
    my $sth;
    if ($main::TEST){
        $sth=$dbh->prepare('SELECT password FROM passwords_test WHERE sendDate=NOW()');
    }
    else{
        $sth=$dbh->prepare('SELECT password FROM passwords WHERE sendDate=NOW()');
    }
    $sth->execute();
    ($self->{password})=$sth->fetchrow_array;
    $sth->finish;
    $dbh->disconnect;
    #
    return (bless $self);
}


    Estavam assim; agora estão assim e funcionam sem o warning :
    
package Inquiry;

require Exporter;

use vars qw(@ISA @EXPORT);

use XML::Simple;

use Supplier::X;

@ISA=qw(Exporter);

@EXPORT=qw();

sub new{

    my $self={};

    $self->{suppliers}=();

    $self->{xmlRequest}="";

    $self->{parsedRequest}=();

    $self->{xmlResponse}="";

    return (bless $self);

}



    o outro package :



package Supplier::X;

require Exporter;

use vars qw(@ISA @EXPORT);

use constant SELFCODE => 2;

@ISA=qw(Exporter);

@EXPORT=qw();

sub new{

    my $self={};

    # Getting day's password

    my $dbh=bdData::mysqlConnect();

    my $sth;

    if ($main::TEST){

        $sth=$dbh->prepare('SELECT password FROM passwords_test WHERE sendDate=NOW()');

    }

    else{

        $sth=$dbh->prepare('SELECT password FROM passwords WHERE sendDate=NOW()');

    }

    $sth->execute();

    ($self->{password})=$sth->fetchrow_array;

    $sth->finish;

    $dbh->disconnect;

    #

    return (bless $self);

}



    Valeu novamente, abraço.

Daniel ® Antunes
profissional de informática
msn daniel.legend em terra.com.br
yahoo-messenger danielrantunes em yahoo.com.br
mobile + 55 11 8965 2999
gnu/linux user #238553

----- Mensagem original ----
De: Alceu Rodrigues de Freitas Junior <glasswalk3r em hotmail.com>
Para: Cascavel Perl Mongers <cascavel-pm em pm.org>
Enviadas: Terça-feira, 10 de Julho de 2007 15:27:04
Assunto: Re: [Cascavel-pm] "Subroutine new redefined at"




P
{
margin:0px;padding:0px;}
body
{
FONT-SIZE:10pt;FONT-FAMILY:Tahoma;}

Date: Tue, 10 Jul 2007 10:26:49 -0700
From: danielrantunes em yahoo.com.br
    Tenho uma classe/package chamada Supplier::X e tenho uma classe/package chamada Inquiry.
    Na classe Inquiry eu chamo a classe  X

    use Supplier::X

    E crio objetos : my $obj=new Supplier::X(); dentro desta classe Inquiry.
    Até aí sem novidades, o Supplier::X faz suas declarações e processamentos normalmente.
    Acontece que na classe Inquiry eu declaro um método (ou member function como chamamos em C) "new" também, pq no script de primeiro nível chamado "inquiry-server.pl" eu crio objetos "Inquiry" :

    my $inquiry=new
 Inquiry();


Você primeiramente deveria parar de usar métodos indiretos de chamar um construtor. Isso evita que você atire no seu pé. Vou comentar um trecho do livro do Damian Conway:

"Another way to call a constructor
Perl provides a second syntax for calling a constructor, or any other method belonging to a
class. It’s known as the indirect object syntax, and it’s already familiar to you. We’ll discuss it
here, and then you should tear out this page and eat it, so that you’ll never be tempted to use
the syntax. You’ll see why shortly."

Agradeça eu não ter comido a página; também acho bastante claro o que ele quiz dizer. Procure sempre usar:

my $object = Class::Something->new();
    Acontece que qdo vou executar o script de primeiro nível que é um server :

daniel em sun4w_nodeF:~/bin/inquiry-server-2$ ./inquiry-server.pl -v -p 10011
Subroutine new redefined at /home/daniel/bin/inquiry-server-2/Inquiry.pm line 147.
--verbose
Inquiry server started, listen on 10011 port.

Me parece que esse problema está sendo causado justamente por causa da chamada de método indireta. Faça um teste aí. E se puder poste o código do Inquiry.pm (caso não resolva) na lista.
    Eu já dei uma caçada na web buscando algum meio de contornar esta warning, pelo que entendi ele está reclamando que eu tenho o método "new" no package Supplier::X e no package Inquiry.

danielrantunes++ #por tentar se virar sozinho

[]'s
Alceu


Play free games, earn tickets, get cool prizes! Join Live Search Club.   Join Live Search Club!_______________________________________________
Cascavel-pm mailing list
Cascavel-pm em pm.org
http://mail.pm.org/mailman/listinfo/cascavel-pm






       
____________________________________________________________________________________
Novo Yahoo! Cadê? - Experimente uma nova busca.
http://yahoo.com.br/oqueeuganhocomisso 
-------------- Próxima Parte ----------
Um anexo em HTML foi limpo...
URL: http://mail.pm.org/pipermail/cascavel-pm/attachments/20070710/66712422/attachment-0001.html 


Mais detalhes sobre a lista de discussão Cascavel-pm