Amit Saxena wrote:
Hi all,
Hello,
I am trying to make a perl code which would read a matrix (basically an array which contains references to other arrays) and initialize a hash with the first value of each dereferenced array acting as a key and remaining elements as values using references. The source code and output are mentioned below :- Source Code ----------------- [root]# cat k1.pl #! /usr/bin/perl use strict; use warnings; my @arr = ( [1, 2, 3, "a", "b"], [4, 5, 6, "c", "d"], [7, 8, 9, "e", "f"] ); my @arr1; my %h; my $a; my $key1; my $i; my $n;
You should only declare your variables in the smallest scope possible, that is the root cause of your problem.
print "Matrix is as follows :- \n"; foreach $a (@arr)
You shouldn't really use $a or $b outside of a sort code block. foreach my $item ( @arr )
{ print "Row = @{$a}\n"; @arr1 = "";
Why are you assigning "" to $arr1[ 0 ]?
$n = @{$a}; for ($i=1; $i<=$n-1;$i++)
That is usually written as: for my $i ( 1 .. $#$a )
{ $arr1[$i-1] = ${$a}[$i]; }
Or more simply (without the loop): @arr1 = @{ $a }[ 1 .. $#$a ];
$h{ ${$a}[0] } = [EMAIL PROTECTED];
Because @arr1 is declared at file scope the reference you are assigning is always the same so every value of %h points to the same array.
You need to either declare @arr1 inside this loop to get a new reference each time through the loop:
my @arr1 = @{ $a }[ 1 .. $#$a ]; $h{ ${$a}[0] } = [EMAIL PROTECTED]; or copy the list to an anonymous array: $h{ ${$a}[0] } = [ @{ $a }[ 1 .. $#$a ] ];
} print "Hash is as follows :- \n"; foreach $key1 (keys %h)
foreach my $key1 ( keys %h )
{ print "Key -> [$key1] : Value -> [EMAIL PROTECTED]"; } print "\n";
John -- Perl isn't a toolbox, but a small machine shop where you can special-order certain sorts of tools at low cost and in short order. -- Larry Wall -- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED] http://learn.perl.org/