Copy constructor and Dup method in Perl



Hi, I have a need for a Class copy constructor and wonder
if anybody has implemented this.

I wan't to turn a unwieldy hash into a class. It is primarily
a data object with a few methods for retreval of formatted data.
It is going to be passed around as a parameter to several methods
of a different class where data will be fleshed out. Instead of
endless conditional testing of the hash, I thought I would just
validate it as a reference to a data class object.

But I would need a copy constructor and/or a duplicate method.
This is because the object is reused and parameters will change
and because the object might need to be saved and stored at any
particular time.


package XReS;

sub new
my ($class, @args) = @_;
my $self = {
.. set default params ..
if (defined($args[0]) && ref($args[0]) eq 'XReS') {
%{$self} = %{$args[0]};
else {
while (my ($name, $val) = splice (@args, 0, 2)) {
.. process other args ..
return bless ($self, $class);
sub Dup
return XReS->new(shift);

Also, do you forsee much more memory overhead by using a
class object instead of just a hash, possibly creating thousands?

Any other pitfalls?



See the dclone function of the Storable module or the article

I knew about deep copy. I read the whole article. I didn't look
at the dclone function yet (as they recommend on that page).

I found it interresting, the recursive sub to find array's that
need to be dup'd. And I'm even better appretiative of Dumper now.

I had some anonymous sub ref's hanging around, wondered about them.

One thing is that if you 'empty' an array, reference or not, by
declaring it with () again, does it create another reference to it
(anonymous or if a reference is taken of it before its cleared)?

I haven't looked at it specifically yet in terms of deep copy but
something like this I will have to resolve:

$href = {};
$href->{aray} = ['1','2'];
@tt = ('1','2');
$href->{aray} = \@tt;

@{$href->{aray}} = ();

I know $href->{aray} is a reference,
but if a copy of $href was made,
before it was cleared with = (), is the data
still intact in the copy, or would I have to
do an explicit $newhref->{aray} = [@{$href->{aray}}] ?

Convuluted. Thanks!


Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Latest member

Latest Threads