I would create array containing max values for each loop and iterate over array.
#!perl -l
@maxvalues = (2, 5, 3);
$input = 3;
my @ids = (0) x $input; # assuming all loops start with 0
while(!$end)
{
# do something
print "[@ids]";
# increase values starting from end of ids array
$index = $#ids;
while(1)
{
$ids[$index]++;
if($ids[$index]<=$maxvalues[$index])
{ last }
else
{ # we reached limit on loop pointed by $index
$ids[$index] = 0;
$index--;
if($index<0) # check stop condition
{ $end = 1 }
}
}
}