Last active
December 31, 2015 04:20
-
-
Save JaHIY/9db961217d4bac9c93eb to your computer and use it in GitHub Desktop.
flatten list in perl
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/env perl | |
use strict; | |
use warnings; | |
use utf8; | |
use 5.014; | |
use Data::Dumper; | |
sub flatten (+) { | |
die 'Not an array or arrayref' if ref( $_[0] ) ne 'ARRAY'; | |
goto &_flatten; | |
} | |
sub _flatten { | |
my ( $before, $after, $origin ) = @_; | |
$after //= []; | |
if ( scalar @_ < 3 ) { | |
@{ $origin } = @{ $before } if defined wantarray; | |
} elsif ( not scalar @{ $before } ){ | |
if ( defined $origin ) { | |
@{ $before } = @{ $origin }; | |
return @{ $after } if wantarray; | |
return $after; | |
} | |
@{ $before } = @{ $after }; | |
return; | |
} | |
my $current = shift @{ $before }; | |
if ( ref( $current ) eq 'ARRAY' ) { | |
unshift @{ $before }, @{ $current }; | |
} else { | |
push @{ $after }, $current; | |
} | |
@_ = ( $before, $after, $origin ); | |
goto &_flatten; | |
} | |
# In array context | |
my @test1 = (1, 2, [3, 4, 5], [6, [7, [8], 9], 10], 11, 12); | |
say 'In array context'; | |
print Dumper flatten( @test1 ); # ( 1 .. 12 ) | |
print Dumper \@test1; # @test1 = (1, 2, [3, 4, 5], [6, [7, [8], 9], 10], 11, 12) | |
# In scalar context | |
my @test2 = (1, 2, [3, 4, 5], [6, [7, [8], 9], 10], 11, 12); | |
say 'In scalar context'; | |
print Dumper scalar flatten( @test2 ); # [ 1 .. 12 ] | |
print Dumper \@test2; # @test2 = (1, 2, [3, 4, 5], [6, [7, [8], 9], 10], 11, 12) | |
# In void content | |
my @test3 = (1, 2, [3, 4, 5], [6, [7, [8], 9], 10], 11, 12); | |
say 'In void content'; | |
flatten( @test3 ); | |
print Dumper \@test3; # @test3 = ( 1 .. 12 ); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment