use strict; use warnings; my %nodes = ( A => 2, B => 4, C => 5, D => 1); my @path = (""); my @newpath; foreach my $k (sort (keys(%nodes))) # each level { my @nodename; for (my $i = 1; $i <= $nodes{$k}; $i++) { push (@nodename, "$k$i"); # generate node-names for each level } foreach my $old (@path) # take all old paths { foreach my $new (@nodename) # append new node to each { push (@newpath, "$old-$new"); } } @path = @newpath; # save old paths @newpath = (); # clear list of new paths } print join("\n", @path); # print all paths (each in a new line) exit 0;