#!/usr/bin/perl use strict; use warnings; use Data::Dumper; sub comp { my( $sub, $var, $list, @x ) = @_; my @l; no strict 'refs'; for ( $list->() ) { ${"::$var"} = $_; push @l, @x ? comp( $sub, @x ) : $sub->(); } # for return @l; } # comp my @tripel = comp sub{ $::i**2 == $::j**2 + $::k**2 ? [$::k, $::j, $::i] : () }, 'i' => sub{ 1.. 10 }, 'j' => sub{ 1..$::i }, 'k' => sub{ 1..$::j }; print Dumper( \@tripel ), "\n";