in reply to Re: Re: flattening a list-of-lists
in thread flattening a list-of-lists
Updated: It now includes checking for cycles.
That seems way complicated. I went with:
which outputs:*isa = \&UNIVERSAL::isa; sub flatten { my @stack= reverse @_; my %seen; my @out; while( @stack ) { my $value= pop(@stack); if( !ref($value) || !isa($value,"ARRAY") ) { push @out, $value; } elsif( ! $seen{0+$value}++ ) { push @stack, reverse @$value; } } return @out; } sub flatten2 { my @out; my %seen; while( @_ ) { my $value= shift(@_); if( !ref($value) || !isa($value,"ARRAY") ) { push @out, $value; } elsif( ! $seen{0+$value}++ ) { unshift @_, @$value; } } return @out; } my @list = ( 1, [ 2, 3 ], 4, [ [ 5, 6 ], 7, [ 8 ] ] ); print join " ", flatten( @list, @list ); print $/; print join " ", flatten2( @list, @list ); print $/;
1 2 3 4 5 6 7 8 1 4 1 2 3 4 5 6 7 8 1 4
|
|---|
| Replies are listed 'Best First'. | |
|---|---|
|
Re: Re^3: flattening a list-of-lists (simpler)
by demerphq (Chancellor) on Nov 19, 2003 at 22:39 UTC |