use strict; use warnings; use Data::Dump qw(dump); use autodie; my %ave; open my $in,'<', "testscores.txt"; while (<$in>){ my ($name, $score) =split /[\s=s,]+/; for (0..3){ $ave{$name}[$_]=$score; } } #dump \%ave; get_ave(\%ave); #get it by hash_ref my %hash_ref; #why do I have to declare ? sub get_ave{ my $hash_ref =@_; #declared here too? my %hash=%$hash_ref; dump \%hash; #dump \%hash_ref; }