#!/usr/bin/perl -w use strict; my @array1 = ( 1 .. 10 ); my @array2 = ( qw(a b c) , [ 28, 42, 84 ] , 'foo bar' ); push @array1 , \@array2; push @array2 , \@array1; print join ' , ' , flatten(\@array1 , \@array2); sub flatten { my @stack = @_; my @flat; my %seen; $seen{$_} = 1 for @stack; while ( @stack ) { my $array = shift @stack; for my $element ( @$array ) { if ( ref $element eq 'ARRAY') { if ( ! $seen{$element} ) { $seen{$element} = 1; unshift @stack , $element; } } else { push @flat , $element; } } } return wantarray ? @flat : \@flat; }