my %songs; while () { my ($myArtist, $myAlbum, $mySong, $myLocation) = split /\|/; $songs{$myArtist}->{$myAlbum}->{$mySong} = $myLocation; } foreach my $myArtist (sort keys %songs) { print "$myArtist:\n"; foreach my $myAlbum (sort keys %{ $songs{$myArtist} }) { print "\t$myAlbum\n"; print "\t\tSongs:\n"; foreach my $mySong (sort keys %{ $songs{$myArtist}->{$myAlbum} }) { print "\t\t\t$mySong: $songs{$myArtist}->{$myAlbum}->{$mySong}\n"; } } }