my $string = 'some text ###RAND{1a|###RAND{2a|2b|2c|###RAND{3a|3b|3c|3d}|2d}|1b|1c|1d} some text'; print process_rands($string)."\n"; sub process_rands { my $sentence = shift; my $count = () = $sentence =~ /###RAND/g; for (1..$count){ $sentence =~ s!.*###RAND\{([^\}]+)\}!get_rand_arr_el(split(/\|/,$1))!eg; print $sentence."\n"; } return $sentence; } sub get_rand_arr_el { my @array = @_; my $randomelement = $array[ rand @array ]; return $randomelement; } #### some text ###RAND{1a|###RAND{2a|2b|2c|###RAND{3a|3b|3c|3d}|2d}|1b|1c|1d} some text some text ###RAND{1a|###RAND{2a|2b|2c|3b|2d}|1b|1c|1d} some text some text ###RAND{1a|2d|1b|1c|1d} some text some text 1c some text