簡體   English   中英

Perl 映射函數的建議

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM