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

#!/usr/bin/perl -W use Data::Dumper; my %customer_type; #my @exist_customer_id; my @customer_id = ('E1', 'E2'); my @customer_count = ('1', '2'); foreach (@customer_count){ foreach(@customer_id){ #push(@exist_customer_id, $_); $customer_type{$_} = "valid"; } push(@customer_type, \%customer_type); } print STDOUT " VALUE " . Dumper(@customer_type);
When i run this code it gives the following output..
VALUE $VAR1 = { 'E2' => 'valid', 'E1' => 'valid' }; $VAR2 = $VAR1;
Why it showing $var2 = $var1 ? While i expected this
$VAR2 = { 'E2' => 'valid', 'E1' => 'valid' };
Can you guide how to get above output..

Replies are listed 'Best First'.
Re: Hash in Array
by kennethk (Abbot) on Jan 05, 2010 at 15:42 UTC
    If I understand your intent, you are having scoping problems. As I understand it, on each iteration of your @customer_count loop, you want to build a new hash. That means you are having a scoping issue. Rather than scoping the %customer_type hash at the script level, you want to declare the new object at the level where you want an empty, new version to appear. If that is unclear, you may garner insight from Private Variables via my(). In any case, one fix would be:

    #!/usr/bin/perl use strict; use warnings; use Data::Dumper; #my %customer_type; #my @exist_customer_id; my @customer_id = ('E1', 'E2'); my @customer_count = ('1', '2'); my @customer_type; foreach (@customer_count){ my %customer_type; foreach(@customer_id){ #push(@exist_customer_id, $_); $customer_type{$_} = "valid"; } push(@customer_type, \%customer_type); } print STDOUT " VALUE " . Dumper(@customer_type);

    Note as well my use of use strict;, which is generally considered to be a Good Thing(TM).

Re: Hash in Array
by JavaFan (Canon) on Jan 05, 2010 at 13:20 UTC
    You are pushing a reference to the same hash twice on the array. So why shouldn't it tell you that? If you want different hashes, put the my %customer_type; inside the loop.