c:\@Work\Perl\monks>perl -wMstrict -le "use Test::More 'no_plan'; use Test::NoWarnings; ;; for my $ar_vector ( [ [], ], [ [], '' ], [ [], '', '' ], [ [], '', '', '' ], [ [ 'A' ], 'A' ], [ [], qw(A A) ], [ [], qw(AA) ], [ [], qw(A A A) ], [ [ qw(A B) ], qw(A B) ], [ [ qw(A B C) ], qw(A B C) ], [ [ qw(A B C D E F G H) ], 'HGFE', 'ABCD' ], [ [ qw(A B C D E F G H I) ], 'GFED', 'HI', 'ABC' ], [ [], 'TTTTTTT', 'TTTTTTTTT' ], [ [ 'A' ], 'TTTATTTT', 'TTTTTTT' ], [ [ qw(A B) ], 'TBTTTTT', 'TTTATTT' ], [ [ qw(A B) ], 'TTTTTTA', 'TTTTTTB' ], ) { my ($ar_expected_singletons, @strings) = @$ar_vector; ;; my $strings_cmnt = qq{@{[ map qq{'$_'}, @strings ]}}; ;; my @got_singletons = singletons(@strings); is_deeply \@got_singletons, $ar_expected_singletons, qq{($strings_cmnt) singleton(s): (@$ar_expected_singletons)}; } ;; done_testing; ;; exit; ;; sub singletons { my %freq; for (@_) { for my $o (0 .. length($_)-1) { ++$freq{substr $_, $o, 1} } }; return sort grep $freq{$_} == 1, keys %freq; } " ok 1 - () singleton(s): () ok 2 - ('') singleton(s): () ok 3 - ('' '') singleton(s): () ok 4 - ('' '' '') singleton(s): () ok 5 - ('A') singleton(s): (A) ok 6 - ('A' 'A') singleton(s): () ok 7 - ('AA') singleton(s): () ok 8 - ('A' 'A' 'A') singleton(s): () ok 9 - ('A' 'B') singleton(s): (A B) ok 10 - ('A' 'B' 'C') singleton(s): (A B C) ok 11 - ('HGFE' 'ABCD') singleton(s): (A B C D E F G H) ok 12 - ('GFED' 'HI' 'ABC') singleton(s): (A B C D E F G H I) ok 13 - ('TTTTTTT' 'TTTTTTTTT') singleton(s): () ok 14 - ('TTTATTTT' 'TTTTTTT') singleton(s): (A) ok 15 - ('TBTTTTT' 'TTTATTT') singleton(s): (A B) ok 16 - ('TTTTTTA' 'TTTTTTB') singleton(s): (A B) 1..16 ok 17 - no warnings 1..17