Skip to content

Instantly share code, notes, and snippets.

@JaHIY
Last active December 31, 2015 04:20
Show Gist options
  • Save JaHIY/9db961217d4bac9c93eb to your computer and use it in GitHub Desktop.
Save JaHIY/9db961217d4bac9c93eb to your computer and use it in GitHub Desktop.
flatten list in perl
#!/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