#!/usr/bin/perl use strict; # https://perlmonks.org/?node_id=11145154 use warnings; use ntheory qw( forcomb ); use List::Util qw( all ); my $firstLetter = 'c'; my $str = 'a?1,a?2,a%3,b?2,b?3,b%5,c%4,c%5,c?6,d%2'; my $subset = 'a?,b%,c?'; my @str = sort { $b =~ $firstLetter <=> $a =~ $firstLetter or # sort only once $b =~ tr/0-9//cdr <=> $a =~ tr/0-9//cdr } split /,/, $str; forcomb { my $comb = join ',', @str[@_]; $comb =~ /\b(\d+)\b.*\b\1\b/ or # duplicate number all { $comb =~ /\Q$_/ } split /,/, $subset and # each subset print "$comb\n"; } scalar @str, 4;