2

我试图从vcake了解特定的 Perl 代码。通常我会在 Perl 中找到自己的方法,但下面的陈述让我感到困惑。我怀疑这只是一个错误,但我不完全确定。声明是:

foreach my $seq (keys %$set) {
    if( (defined $set->{$seq}) and (my $numReads >= ($coverage)) ) {
        do something;
    }
    ...
}

$coverage已在文件开头定义为标量整数(例如 10),并且永远不会再次写入。$numReads仅在上面的行中使用,其他地方都没有

$set另一方面,在循环内部进行了修改,因此条件的第一部分非常有意义。我不明白的是第二部分,因为在我看来,这将始终评估为相同的值,我不明白$numReadsor>=重要性。有人可以启发我吗?是否可能涉及不可见的自动变量?

4

2 回答 2

16

my $numReadsforeach意思是:在循环的上下文中创建一个新的局部变量。它的初始值为undef,在数值上下文中被视为0。所以代码如下:

if ((...) and (0 >= ($coverage)) ) {
}

这意味着除非 $coverage 设置为 0 或更少,否则永远不会执行“做某事”。

如果这是调试代码,我会假设 $coverage 用于启用/禁用此语句。

我的猜测是:你发现了一个错误。

于 2008-12-01T16:54:01.333 回答
4

人们可能还注意到,除非 $set 是对 %set 的引用,或者其他一些模仿 %set 结构的哈希,否则该行

foreach my $seq (keys %set)

不符合条件

defined $set->{$seq}

由于 $set->{$seq} 取消引用哈希引用,并且 %set 是哈希。这更有可能是第二个错误,而不是有人用 hashref 实例化了散列 %set 和标量 $set。

于 2008-12-02T10:51:55.650 回答