my $desired_page_count = 10; # Structure holding all the different page layouts. ('l' = Landscape, 'p' = Portrait) my $pages = { ll => '01', pp => '02', lp => '03', pl => '04', lpp => '05', pll => '06', plp => '07', lpl => '08', lll => '09', ppp => '10', ppl => '11', llp => '12', ppll => '13', llpp => '14', }; my $photos = "llppllpplpppllplpplpplpllplpll"; # Make a really long layout -- at much over 100, it tends to hang up $photos .= substr 'lp', rand 2 for 1..100; $desired_page_count = int( length($photos)/ 2.7 ); my $page_regex = join '|', keys %$pages; my $regex = "($page_regex)"; $regex .= "(?!\\$_)($page_regex)" for 1..($desired_page_count - 1); print "\$regex is $regex\n"; if (my @pages = $photos =~ /^$regex$/) { # Added the anchors as per SmugX's reply print "$pages->{$_}\n" for @pages; } else { print "Could not come up with no-repeat layout in $desired_page_count pages\n"; }