use strict; my @Server = qw(google google google web gmx ); my @Pfad = qw(start start test mail sms ); my @Datei = qw(index start login test send); my $l = scalar @Server; die "unterschiedlich große Arrays" if $l != scalar @Server or $l != scalar @Pfad or $l != scalar @Datei ; my %Hash = ( server => {} ); for my $index (0..$l-1) { # äußeren Hash-Schlüssel anlegen, Wert ist leeres anonymes Hash: $Hash{server}->{$Server[$index]} = {}; # Pfad als Schlüssel eintragen und leeres anonymes Array als Wert: $Hash{server}->{$Server[$index]}->{folder} = { $Pfad[$index] => { datei => [ ] } }; } # inneres Array füllen: for my $index (0..$l-1) { push @{ $Hash{server}-> {$Server[$index]}-> {folder}-> {$Pfad[$index]}-> {datei} }, $Datei[$index]; } use Data::Dumper; print Dumper \%Hash;