use strict; use warnings; my @data = qw( 000- 0101 011- 1-0- ); my ($re) = map "(?{''})(?:$_)(?{push \@results, oct \"0b\$^R\"})(?!)", join '|', map { local $_ = $_; s/([01]+)/(?{\$^R.'$1'})/g; s/-/(?:(?{\$^R.0})|(?{\$^R.1}))/g; $_ } @data; local our @results; { use re 'eval'; '' =~ /$re/ } local $, = ", "; local $\ = "\n"; print @results; #### / (?{''}) (?: (?{$^R.'000'}) (?:(?{$^R.0})|(?{$^R.1})) | (?{$^R.'0101'}) | (?{$^R.'011'}) (?:(?{$^R.0})|(?{$^R.1})) | (?{$^R.'1'}) (?:(?{$^R.0})|(?{$^R.1})) (?{$^R.'0'}) (?:(?{$^R.0})|(?{$^R.1})) ) (?{ $push @results, oct "0b$^R" }) (?!) /x