[bcn-pm] Re: Barcelona-pm Digest, Vol 1, Issue 106

albert vilella vilella at bio.ub.es
Fri Jul 18 09:07:39 CDT 2003


On Fri, 2003-07-18 at 12:41, barcelona-pm-request at mail.pm.org wrote:
> Send Barcelona-pm mailing list submissions to
> 	barcelona-pm at mail.pm.org
> 
> To subscribe or unsubscribe via the World Wide Web, visit
> 	http://mail.pm.org/mailman/listinfo/barcelona-pm
> or, via email, send a message with subject or body 'help' to
> 	barcelona-pm-request at mail.pm.org
> 
> You can reach the person managing the list at
> 	barcelona-pm-owner at mail.pm.org
> 
> When replying, please edit your Subject line so it is more specific
> than "Re: Contents of Barcelona-pm digest..."
> 
> 
> Today's Topics:
> 
>    1. Re: Barcelona-pm Digest, Vol 1, Issue 105 (albert vilella)
>    2. Re: fer c?pia d'un objecte (Alex Muntada)
>    3. Re: fer c?pia d'un objecte (Anarion)
>    4. MJS show cartell (Francesc Guasch)
> 
> 
> ----------------------------------------------------------------------
> 
> Message: 1
> Date: 17 Jul 2003 19:46:45 +0200
> From: albert vilella <vilella at bio.ub.es>
> Subject: [bcn-pm] Re: Barcelona-pm Digest, Vol 1, Issue 105
> To: barcelona-pm at mail.pm.org
> Cc: anarion at manresa.net
> Message-ID: <1058464005.1363.71.camel at localhost>
> Content-Type: text/plain; charset="iso-8859-15"
> 
> > Message: 3
> > Date: 17 Jul 2003 17:13:42 +0200
> > From: albert vilella <vilella at bio.ub.es>
> > Subject: [bcn-pm] fer c?pia d'un objecte
> > To: barcelona-pm at mail.pm.org
> > Message-ID: <1058454822.1363.60.camel at localhost>
> > Content-Type: text/plain; charset="iso-8859-15"
> > 
> > Hola,
> > 
> > tinc una pregunta molt tonta de OO de perl no acabo de veure clara:
> > 
> > Començo per crear un objecte:
> > 
> > $a = Bio::SeqFeature::Generic->new();
> > 
> > ara treballo amb ell, modificant els seus valors:
> > 
> > $a->seq = "AATCCATCAG";
> > $a->length = 10;
> > #...
> > 
> > I ara vull fer una còpia. Com ho faig?
> > 
> > $b = Bio::SeqFeature::Generic->new();
> > $b = $a;
> > 
> > Llavors $b i $a ja són dos objectes independents?
> > 
> > Ara necessito modificar $b (sense modificar $a):
> > 
> > $b->seq = "AAA";
> > $b->length = 3;
> > #...
> > 
> > Llavors $a no s'hauria de modificar, oi?
> > 
> > O m'estic perdent en algún punt...
> > 
> > Gràcies
> > -------------- next part --------------
> > A non-text attachment was scrubbed...
> > Name: not available
> > Type: application/pgp-signature
> > Size: 189 bytes
> > Desc: This is a digitally signed message part
> > Url : http://mail.pm.org/pipermail/barcelona-pm/attachments/20030717/8c451964/attachment-0001.bin
> > 
> > ------------------------------
> > 
> > Message: 4
> > Date: Thu, 17 Jul 2003 18:46:36 +0200
> > From: Anarion <anarion at manresa.net>
> > Subject: Re: [bcn-pm] fer c?pia d'un objecte
> > To: Barcelona Perl Mongers <barcelona-pm at mail.pm.org>
> > Message-ID: <200307171846.36641.anarion at manresa.net>
> > Content-Type: text/plain;  charset="iso-8859-1"
> > 
> > A Dijous 17 Juliol 2003 17:13, albert vilella va escriure:
> > > Començo per crear un objecte:
> > >
> > > $a = Bio::SeqFeature::Generic->new();
> > >
> > > ara treballo amb ell, modificant els seus valors:
> > >
> > > $a->seq = "AATCCATCAG";
> > > $a->length = 10;
> > > #...
> > >
> > > I ara vull fer una còpia. Com ho faig?
> > >
> > > $b = Bio::SeqFeature::Generic->new();
> > > $b = $a;
> > Aqui acabes de sobrescriure $b amb $a.
> > $a no es mes que una refenrencia a algun tipus de dades, i ara i $a i $b son 
> > una referencia al mateix objecte.
> > >
> > > Llavors $b i $a ja són dos objectes independents?
> > >
> > No.
> > > Ara necessito modificar $b (sense modificar $a):
> > >
> > > $b->seq = "AAA";
> > > $b->length = 3;
> > > #...
> > >
> > > Llavors $a no s'hauria de modificar, oi?
> > >
> > > O m'estic perdent en algún punt...
> > Estas modificant $a i $b perque son el mateix objecte. La disponibilitat de 
> > clonar un objecte a destar implementada a la clase que utilitzes. Sino sempre 
> > pots fer algun truc com usar Data::Dumper i eval i ferte un clonatge manual.
> 
> Ja ho veig.
> Seria una cosa així, oi?
> 
>       my $c = Data::Dumper->new([$a], ['c']);
>       my $dump = $c->Dump;
>       $b = eval $dump;
> 
> Moltes gràcies :-)
> 
> 
> -------------- next part --------------
> A non-text attachment was scrubbed...
> Name: not available
> Type: application/pgp-signature
> Size: 189 bytes
> Desc: This is a digitally signed message part
> Url : http://mail.pm.org/pipermail/barcelona-pm/attachments/20030717/d2df23df/attachment-0001.bin
> 
> ------------------------------
> 
> Message: 2
> Date: Fri, 18 Jul 2003 04:19:51 +0200
> From: Alex Muntada <alexm at cpan.org>
> Subject: Re: [bcn-pm] fer c?pia d'un objecte
> To: Barcelona Perl Mongers <barcelona-pm at mail.pm.org>
> Message-ID: <20030718021951.GD16651 at ac.upc.es>
> Content-Type: text/plain; charset=iso-8859-1
> 
> -----BEGIN PGP SIGNED MESSAGE-----
> Hash: SHA1
> 
> Quoting Anarion:
> 
> > La disponibilitat de clonar un objecte a destar implementada
> > a la clase que utilitzes.
> 
> No soc cap expert en Bioperl, però fent un cop d'ull al manual
> diria que el que tu busques és el següent:
> 
>   $a = new Bio::SeqFeature::Generic();
> 
>   $b = new Bio::SeqFeature::Generic(
>     -gff_string => $a->gff_string
>   );
> 
> Però et recomano que miris la web que apareix a la documentació
> (bio.perl.org) perquè hi trobaràs de tot... jo he quedat ben
> parat!
> 
> > Sino sempre pots fer algun truc com usar Data::Dumper i eval
> > i ferte un clonatge manual.
> 
> Tractant-se de programació amb objectes, haver d'utilitzar el
> Data::Dumper fa molt lleig, encara que funcioni. Per tant, us
> desaconsello totalment aquest mètode en casos com aquest, o ja
> em direu per a què serveix l'OOP sinó...
> ;-)
> 
> - --
> Alex Muntada <alexm at cpan.org>
> http://alexm.org/
> 
> -----BEGIN PGP SIGNATURE-----
> Version: GnuPG v1.0.7 (GNU/Linux)
> 
> iD8DBQE/F1kULdxCGS3zaBERAu73AKCU/Iu9S9laCsmVagVnqTZk3UtbZgCfZRC4
> 5QJdkcio3/YjKAotfMPPObA=
> =fPA0
> -----END PGP SIGNATURE-----
> 
> ------------------------------
> 
> Message: 3
> Date: Fri, 18 Jul 2003 10:55:19 +0200
> From: Anarion <anarion at manresa.net>
> Subject: Re: [bcn-pm] fer c?pia d'un objecte
> To: Barcelona Perl Mongers <barcelona-pm at mail.pm.org>
> Message-ID: <200307181055.20117.anarion at manresa.net>
> Content-Type: text/plain;  charset="iso-8859-1"
> 
> A Divendres 18 Juliol 2003 04:19, Alex Muntada va escriure:
> > Per enviar email a la llista:
> > barcelona-pm at pm.org
> > http://mail.pm.org/mailman/listinfo/barcelona-pm
> >
> > Quoting Anarion:
> > > La disponibilitat de clonar un objecte a destar implementada
> > > a la clase que utilitzes.
> >
> > No soc cap expert en Bioperl, però fent un cop d'ull al manual
> > diria que el que tu busques és el següent:
> >
> >   $a = new Bio::SeqFeature::Generic();
> >
> >   $b = new Bio::SeqFeature::Generic(
> >     -gff_string => $a->gff_string
> >   );
> >
> Jo ni tan sols m'havia mirat la documentacio del modul, pero mextranyava que 
> no tingues un metode per clonar.
> Tal com dius tu, es facil clonar un objecte segons la documentacio, tot i que 
> l'objecte te algunes diferencies no se ben be perque, segurament per algun 
> error alhora de clonarlo:
> 
> use Bio::SeqFeature::Generic;
> use Data::Dumper;
> my $c = Bio::SeqFeature::Generic->new(  -start => 10,
>                                         -end => 100,
>                                         -strand => -1,
>                                         -primary => 'repeat',
>                                         -source_tag => 'repeatmasker',
>                                         -score  => 1000,
>                                         -tag    => {
>                                         new => 1,
>                                         author => 'someone',
>                                         sillytag => 'this is silly!' } );
> 
> my $d = Bio::SeqFeature::Generic->new( -gff_string => $c->gff_string );
> print Dumper \$d;
> print Dumper \$c;
> 
> > Però et recomano que miris la web que apareix a la documentació
> > (bio.perl.org) perquè hi trobaràs de tot... jo he quedat ben
> > parat!
> >
> > > Sino sempre pots fer algun truc com usar Data::Dumper i eval
> > > i ferte un clonatge manual.
> >
> > Tractant-se de programació amb objectes, haver d'utilitzar el
> > Data::Dumper fa molt lleig, encara que funcioni. Per tant, us
> > desaconsello totalment aquest mètode en casos com aquest, o ja
> > em direu per a què serveix l'OOP sinó...
> > ;-)
> El metode que li he dit jo, es una manera general de clonar un objecte per a 
> gairebe totes les clases, un hack per poder fer el que no es podia fer un cop 
> mirada la documentacio suposant que se l'hagues mirada. Per trencar 
> lencapsulacio sa de tenir un bon mutiu, no el no llegirse la documentacio, 
> pero com el perl no es java, a vegades hi han bons mutius per feru encara que 
> aquest no sigui el cas.
> 
> Jo desaconsello usar el "indirect object notation" en cualsevol cas aixi com 
> utilitzar les variables $a i $b ni que sigui en un exemple.
> 
> PD: Es mes rapid usar eval i Dumper que no la propia clase en aquest cas.


Bé, en l'exemple només tocava un parell de coses, però en l'script que
estava fent he de tenir una còpia de l'objecte, que conté un grup
d'objectes, i modificar-la en alguns punts.

Jo he vist a la documentació que es poden clonar alguns objectes bàsics,
amb el mètode clone, però per als que m'interessen diu que:

=head2 clone

Purpose   : To deeply copy an object.
           : Creates a new object reference containing an exact 
           : copy of an existing object and all its data members.
 Usage     : $myClone = $myObj->clone;
 Comments  : This method only clones the Bio::Root::Object data members.
           : To fully clone an object that has data members beyond 
           : those inherited from Bio::Root::Object, you must provide a 
           : constructor in your class to copy all data of an object
           : data into the clone. For an example, see how _set_clone()
           : is called by _initialize() in this class.
           :
           : clone() will pass the named parameters {-MAKE=>'clone'} 
           : and {-OBJ=>$self} to the object's constructor. The
           : constructor should then either check the -MAKE parameter
           : directly or should check the return value from
           : a call to the superclass constructor (see _initialize()
           : for an example) and then copy the required data members
from OBJ
           : into the new object, bypassing the normal construction
process.
           : Cloning of objects has not been extensively tested.
           : USE WITH CAUTION.
 Status    : Experimental


Això de:

...you must provide a constructor in your class to copy all data of an
object data into the clone...

a mi se m'escapa de les mans. No sé com fer-ho.

A no ser que algú ho vegi fàcilment, ho preguntaré als del bioperl si hi
ha una manera més neta de fer-ho,

Moltes gràcies per les molèsties que us heu pres,

Albert




More information about the Barcelona-pm mailing list