#I like commas at the beginning so that I know the line #is a continuation of the previous, but others like commas #at the end of each line. The main thing is one assignment #per line. my %TagsMPEG = ('comment' => \&_Get_Comment , 'genre' => \&_Get_Genre , 'year' => \&_Get_Year , 'track' => \&_Get_Track , 'length' => \&_Get_Length , 'bitrate' => \&_Get_Bitrate , 'samplerate' => \&_Get_Samplerate , 'channels' => \&_Get_Channels ); #### $Artist{_Get_Artist($m)}{_Get_Album{$m}}{_Get_Title{$m}}=\%TagInfo; #### sub HashMPEG { # assign parameters useful names # $hArtist is a hash reference my ($f, $hArtist) = @_; #... extract data from MPEG file # -> operator is used when working with hash references rather # than hashes $hArtist->{_Get_Artist($m)}{_Get_Album{$m}}{_Get_Title{$m}}=\%TagInfo; # no need to return anything. artist is in hash reference # and caller has access to hash reference }