[英]Advice on Perl map function
我很難理解下面 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
這是“DWIM”的一部分——數組索引需要是一個數字,所以傳入的內容被轉換為一個,盡可能解釋器可以做/猜測。 在undef
情況下,至少很清楚 - 變為0
。
但這確實是一個編程錯誤,或者至少是草率。
做你所期望的:
my @res = map { $list[ $_ ] } grep { defined } @curr;
或者,在對列表的一次迭代中
my @res = map { defined $_ ? $list[$_] : () } @curr;
這里由()
指示的空列表被壓平到返回列表中,從而消失。 但是三元組的重點是能夠放置一些有意義的東西,如果確實需要刪除某些輸入,那么首先使用顯式grep
會更清晰。
注意有use warnings;
到位你會聽到這一切
在數組元素中使用未初始化的值 $_...
(它會將其轉換為數字)
每個腳本確實必須以use warnings;
開始use warnings;
(並use strict;
)。 有時,繼承舊腳本的最大部分是堅持use warnings;
立即在頂部(然后瀏覽全屏消息 :(。
我想回答我自己的問題, undef 有時被視為零。 這就是為什么 $list[undef] 與 $list[0] 相同
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.