#!/usr/bin/perl use strict; use warnings; use Data::Dumper; print Dumper P('test', 2, 3); exit; sub P { my @bulk = @_; my $res = []; foreach my $row (map {[split '', $_]} glob "{0,1}" x @bulk) { push @$res, [grep {$_ ne 0} map {$row->[$_] && $bulk[$_]} (0..$#bulk)];} return $res; }