【发布时间】:2021-07-22 14:02:45
【问题描述】:
我很难理解下面 Perl 脚本中 map 函数的行为
my @list = qw/A C T G/;
my @curr = (0, undef, undef, 1);
my @res = map { $list[ $_ ] } @curr;
print @res; #prints AAAC
@res 的值为AAAC。我原以为它只是AC,因为@curr 的两个中间值是undef。
我对map的理解是列表中的每一项依次变成$_的值。所以我可以理解$list[0] 如何返回A 以及$list[1] 如何返回C。我不明白undef 值为什么/如何返回A?在我看来$list[undef] 不会是一个值?
我可能在这里遗漏了一些明显的东西,但非常感谢您的帮助
我从中获取此代码的脚本如下。我在调试器中单步执行它,我可以在sub gen_permutate返回的最后一行看到这种行为
my @DNA = qw/A C T G/;
my $seq = gen_permutate(14, @DNA);
while ( my $strand = $seq->() ) {
print "$strand\n";
}
sub gen_permutate {
my ($max, @list) = @_;
my @curr;
return sub {
if ( (join '', map { $list[ $_ ] } @curr) eq $list[ -1 ] x @curr ) {
@curr = (0) x (@curr + 1);
else {
my $pos = @curr;
while ( --$pos > -1 ) {
++$curr[ $pos ], last if $curr[ $pos ] < $#list;
$curr[ $pos ] = 0;
}
}
return undef if @curr > $max;
return join '', map { $list[ $_ ] } @curr;
};
}
J
【问题讨论】:
-
始终使用
use strict; use warnings;或同等名称。它会揭示你为什么得到AAAC。
标签: perl dictionary