use feature qw( say ); use Algorithm::Loops qw( NestedLoops ); sub someFunction { my ($s, $subs) = @_; my @loops = map [ $_ ], split //, $s; for (keys(%$subs)) { push @{ $loops[$_-1] }, split //, $subs->{$_}; } return NestedLoops(\@loops, sub { join('', @_) }); } my $s = 'fred'; my %subs = ( 2 => 'xy', 3 => 'ab', ); say for someFunction($s, \%subs);