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;