#!/usr/bin/perl use strict; use warnings; use Data::Dumper; my @words = qw/foo bar buz qiz/; my $words_cnt = @words; my @wanted = grep { @$_ >= 2; } map { my $i = $_; [ @words[grep { $i->[$_] > 0} 0..@$i-1] ]; } map { [ split //, sprintf "%0" . $words_cnt . "b", $_ ] } 1..(2**$words_cnt-1); warn Dumper \@wanted;