copying array of hashes

how can I make a copy of an array of hashes so that the original one isn't affected? I don't have use storage in my PERL version
cucugirlAsked:
Who is Participating?
 
ozoConnect With a Mentor Commented:
@array=({k1=>'v1',k2=>'v2'},{k1=>'v1',k2=>'v2'});
@copy=map{{%$_}}@array;
$copy[1]{k2}++;
print "$copy[1]{k2} $array[1]{k2}\n";
0
 
Adam314Commented:
>>I don't have use storage
I'm assuming you meant you don't have the Storable module?  If so, can you install it?  Have you tried?  Did you get an error?
0
 
vikaskhoriaConnect With a Mentor Commented:
Check my script below:
(This deletes elements from the hash and the original hash is modified to the desired hash)

Thanks,
Vikas.

#!/usr/bin/perl
 
my %my_hash = ('TEST' =>'T' ,'QUIZ'=>'4','HWORK'=>'3');
my @table = ( {'TEST'=>'T'}, {'TEST'=>'F'},{'QUIZ'=>'1'},{'QUIZ'=> '2'},{'HWORK'=>'3'}, {'HWORK'=>'3'});
 
for my $value (keys %my_hash)
{
        my $found = 0;
        foreach $i (0 .. @table-1)
        {
                if ( $table[$i]{$value} == $my_hash{$value} ) {
                        $found = 1;
                }
        }
        if ( ! $found )
        {
                delete($my_hash{$value});
        }
}

Open in new window

0
 
vikaskhoriaCommented:
Check this link below:
http://www.perlmonks.org/?node_id=93693

This talks about copying array of hashes.
This may be of some help to you.
0
 
wilcoxonConnect With a Mentor Commented:
The best way is to use Clone (this handles any level of nested structures).  Alternately, if you know that the hashes only contain scalars, it's easy to copy them manually.
my $orig = [{first=>1,second=>2},{first=>3,second=>4}]; 
# using Clone
use Clone qw(clone);
my $copy = clone($orig); 
# manually copying
## slow/inefficient way
my $copy = [];
foreach my $el (@$orig) {
    my %tmp;
    foreach my $key (%$el) {
        $tmp{$key} = $el->{$key};
    }
    push @$copy, {%tmp};
}
## better way
my $copy = [];
foreach my $el (@$orig) {
    push @$copy, {%$el};
}
## ozo's way - more succinct but should be about same performance (I think)
my $copy = [map { {%$_} } @$orig];

Open in new window

0
All Courses

From novice to tech pro — start learning today.