my @a = qw( a b ); my @b = map { my $x = $_; map { $x . $_ } @a; } @a; #### my @a = qw( a b c ); #### my @b = map { my $x = $_; map { my $y = $_; map { $x . $y . $_ } @a; } @a; } @a; #### sub f { my ( $n, @a ) = @_; croak "illegal value for n: $n" if $n < 1; return @a if $n == 1; map { my $x = $_; map { $x . $_ ) } f( $n - 1, @a ); } @a; } #### sub f { my ( $n, $g, @a ) = @_; croak "illegal value for n: $n" if $n < 1; return @a if $n == 1; map { my $x = $_; map { $g->( $x, $_ ) } f( $n - 1, $g, @a ); } @a; }