Похоже, вы хотели бы получить доступ к стеку pushdown локальных значений $_
. Это может быть крутым. Тем не менее, вы можете сделать что-то , как это самостоятельно. Я могу показать вам основы.
our @A; # declare a stack
*::A = *A{ARRAY}; # "Globalize" it if necessary.
sub pd (&;@) # <- block operator prototype indicating language sugar
{
# I would have really preferred to do a push here.
local @A = ( @A, $_ );
# pull the block argument
my $block = shift;
# Ensure at least one execution
@_ = $_ unless @_;
# + Scalar behavior option #1
# return $block->( local $_ = shift ) if not wantarray // 1;
# + Scalar behavior option #2
# unless ( wantarray // 1 ) {
# my $result;
# while ( @_ ) {
# local $_ = shift;
# return $result if defined( $result = $block->( $_ ));
# }
# return;
# }
# Standard filter logic
return map { $block->( $_ ) } @_;
}
И вот простое понимание списка, основанное на этом:
my @comp
= map { pd { pd { join '', @A[-2,-1], $_ } qw<g h> } qw<d e f>; } qw<a b c>
;
Вот @comp
:
@comp: [
'adg',
'adh',
'aeg',
'aeh',
'afg',
'afh',
'bdg',
'bdh',
'beg',
'beh',
'bfg',
'bfh',
'cdg',
'cdh',
'ceg',
'ceh',
'cfg',
'cfh'
]