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