#!/usr/bin/perl use strict; use warnings; use Data::Dumper; sub potset { my @set = @{shift(@_)}; if (@set == 0) { return [[]]; } else { my @ps = @{potset([@set[1..$#set]])}; return [(map { my @l = @$_; push @l, $set[0]; [@l]; } @ps), @ps]; } } print Dumper(potset(\@ARGV));