这个Perl条件有什么作用?

时间:2008-12-01 16:48:02

标签: perl conditional

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

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

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

另一方面,

$set在循环内被修改,因此条件的第一部分非常有意义。我不明白的是第二部分,因为在我看来,这将总是评估为相同的值而我不理解$numReads>=在这里的重要性。有人可以赐教吗?是否涉及隐形自动变量?

2 个答案:

答案 0 :(得分:16)

my $numReads表示:在foreach循环的上下文中创建一个新的局部变量。其初始值为undef,在数值上下文中将其视为0。 所以代码如下:

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

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

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

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

答案 1 :(得分:4)

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

foreach my $seq (keys %set)

与条件不匹配

defined $set->{$seq}

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