use strict; use warnings; my $chars = 'ABC---'; my %seen; my @letters = grep /[a-z]/i, split '', $chars; my $regex = join '.*', @letters; my $string = ( '{' . ( join ',', split '', $chars ) . '}' ) x length $chars; print "$_\n" for grep { /$regex/ and !$seen{$_}++ and @{ [/[a-z]/ig] } == @letters } glob $string; #### ABC--- AB-C-- AB--C- AB---C A-BC-- A-B-C- A-B--C A--BC- A--B-C A---BC -ABC-- -AB-C- -AB--C -A-BC- -A-B-C -A--BC --ABC- --AB-C --A-BC ---ABC