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;