In your first code above,
$wo_usr_proj{$proj} is a reference to an array, not an array. You need to dereference this value, as you did in your call to
push:
push @{$wo_usr_proj{$project}}, $user;
Currently the
sort call is only sorting a list with one value (the address of the array stored in
$wo_usr_proj{$proj}). The code below corrects this by dereferencing the hash element to retrieve the array:
foreach $proj(sort(keys(%wo_usr_proj)))
{
print RHANDLE "$proj:\n";$wo_usr_proj{$proj}
# note dereference: @{ $array_ref_here }
foreach $element(sort @{ $wo_usr_proj{$proj} })
{
print RHANDLE "$element\n";
}
print RHANDLE "\n\n";
}
Please take a look at
Data::Dumper, as it is invaluable in illustrating the structure of the data in your code. You simply pass the
Dumper function a reference to the data structure you wish to see expanded:
use Data::Dumper;
print Dumper \%wo_usr_proj;
__END__
$VAR1 = {
'project2' => [
'WO',
'WO2
],
'project1' => [
'WO'
]
};
As for your second code snippet, the code is not dereferencing
$element, but rather, is creating another reference to
$element.
If
$scalar is a
reference to a scalar value, dereference using
$$scalar:
my $foo= "bar";
my $ref= \$foo;
print $$ref;
__END__
bar
If
$arr is a reference to an array, dereference using
@$arr:
my @array= qw(foo bar baz);
my $ref= \@array;
print join ':' => @$ref;
__END__
foo:bar:baz
If
$href is a reference to a hash, dereference using
%href:
my %h= ( foo => 'bar' );
my $ref= \%h;
while( my( $k, $v )= each %$ref ) {
print "$k -> $v"
}
__END__
foo -> bar
Please see the pod for
perlreftut,
perldsc, and
perllol for more details.