#! /usr/bin/perl use strict; use warnings; use Data::Dumper; my @array = qw(1 2 3 4 5); my $potenz = P(\@array); print Dumper($potenz); sub P{ my ($arrayref) = @_; my $potenzmenge = []; my $base = [[]]; my $bool = 1; my $length = 0; while($bool){ push(@$potenzmenge,@$base); $base = calc_elems($base,$arrayref,$length); $length++; $bool = 0 if($length > scalar(@$arrayref)) } return $potenzmenge; } sub calc_elems{ my ($base,$arrayref,$length) = @_; my @array = @{$arrayref}; my @new_elems = (); foreach my $base_elem(@$base){ foreach my $index($length..(scalar(@array) - 1)){ my @tmp_elem = @{$base_elem}; last if($tmp_elem[-1] && ($tmp_elem[-1] >= ($array[-1])) && $length > 0); next if($tmp_elem[-1] && (($tmp_elem[-1] == $array[$index]) || $tmp_elem[-1] > $array[$index])); push(@tmp_elem,$array[$index]); push(@new_elems,[@tmp_elem]); } } return \@new_elems; }