Copy constructor and Dup method in Perl

Do you have a question? Post it now! No Registration Necessary.  Now with pictures!

Threaded View
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') {
        % = %;
    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?


Re: Copy constructor and Dup method in Perl

Quoted text here. Click to load it

See the dclone function of the Storable module or the article

Jim Gibson

Re: Copy constructor and Dup method in Perl

Quoted text here. Click to load it

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-> = ['1','2'];
@tt = ('1','2');
$href-> = \@tt;

@} = ();

I know $href-> 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-> = [@}] ?

Convuluted. Thanks!


Site Timeline