http://www.perlmonks.org?node_id=93693

dooberwah has asked for the wisdom of the Perl Monks concerning the following question:

Is there any easy way for copying an array of hashes? My understanding is that @array2 = @array1 (where @array1 is an array of hashes) won't make a new copy because it just copies the refrences into @array2. I'd like to know if there's an easier way of making a copy of @array1 than looping through it and copying each element.

Originally posted as a Categorized Question.

Replies are listed 'Best First'.
Re: Copying an Array of Hashes
by tachyon (Chancellor) on Jul 04, 2001 at 17:30 UTC

    Technically there is no such thing as an array of hashes. When we speak of an array of hashes what we really have is an array of references to hashes so the assignment:

    @array2 = @array1
    will only assign the contents of @array1 (the hash references) to @array2. Here is some code that demonstrates the difference between assignment and completely cloning @array1
    print "Here is what happens with assignment\n"; my @array1 = ( {foo=>'foo1', bar=>'bar1' } , {foo=>'foo2', bar=>'bar2' + } ); my @array2 = (); @array2 = @array1; print "\@array1: @array1\n"; print "\@array1: @array2\n"; $array1[0]{foo} = 'new'; print "\$array1[0]{foo}: $array1[0]{foo}\n"; print "\$array2[0]{foo}: $array2[0]{foo}\n"; print "Here is how to clone \@array1\n"; my @array1 = ( {foo=>'foo1', bar=>'bar1' } , {foo=>'foo2', bar=>'bar2' + } ); my @array2 = (); for (@array1) { my %new_hash = %$_; push @array2, \%new_hash; } print "\@array1: @array1\n"; print "\@array1: @array2\n"; $array1[0]{foo} = 'new'; print "\$array1[0]{foo}: $array1[0]{foo}\n"; print "\$array2[0]{foo}: $array2[0]{foo}\n";

    Run this code to see the differences. In the first case when we change one of the hash elements both @array1[0]{foo} and @array2[0]{foo} are changed as they both point to the same anonymous hash. In the second case we generate a new anon hash and push references to it into @array2. We now have a true independent clone as you can see by the different references in the array and the different result of changing @array1[0]{foo}.

    cheers

Re: Copying an Array of Hashes
by Masem (Monsignor) on Jul 04, 2001 at 01:42 UTC
    The best way to copy any complex data structure is to use something like the Clone module; it will make a complete copy of all nested data items for you. Mind you, if you are trying to make a new array but with the same references to hashes, you'll have to do a element-by-element copy, as Clone will try to make copies of the hashes instead.