#!/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; #### c?6,c%4,b%5,a?2 c?6,c%4,b%5,a?1 c?6,b%5,a%3,a?2 c?6,b%5,a%3,a?1 c?6,b%5,b?3,a?2 c?6,b%5,b?3,a?1 c?6,b%5,a?2,a?1 c?6,b%5,b?2,a?1 c?6,b%5,d%2,a?1