Что делает этот Perl условно? - PullRequest
2 голосов
/ 01 декабря 2008

Я пытаюсь понять определенный код Perl из vcake . Обычно я нахожу свой путь в Perl, но следующее утверждение сбивает меня с толку. Я подозреваю, что это просто ошибка, но я не совсем уверен. Заявление:

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

$coverage был определен в начале файла как скалярное целое число (например, 10) и никогда больше не записывается в. $numReads используется только в строке выше, больше нигде !

$set, с другой стороны, модифицируется внутри цикла, поэтому первая часть условия имеет смысл. Что я не понимаю, так это вторую часть, потому что, на мой взгляд, она всегда будет иметь одинаковое значение, и Я не понимаю значения $numReads или >= здесь . Может кто-нибудь, пожалуйста, просветите меня? Возможно, задействованы невидимые автоматические переменные?

Ответы [ 2 ]

16 голосов
/ 01 декабря 2008

my $numReads означает: Создать новую локальную переменную в контексте цикла foreach. Его начальное значение undef, которое в числовом контексте рассматривается как 0. Итак, код гласит:

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

, что означает, что "сделать что-то" никогда не выполняется, если $ охват не установлен на 0 или меньше.

Если бы это был отладочный код, я бы предположил, что для покрытия / отключения этого оператора используется $ охват.

Мое предположение: вы нашли ошибку.

4 голосов
/ 02 декабря 2008

Можно также заметить, что если $ set не является ссылкой на% set или каким-либо другим хешем, который имитирует структуру% set, то строка

foreach my $seq (keys %set)

Не соответствует условию

defined $set->{$seq}

Поскольку $ set -> {$ seq} разыменовывает ссылку на хэш, а% set является хешем. Скорее всего, это вторая ошибка, чем то, что кто-то создал и хеш-%, и скалярный $, с помощью хеш-ссылки.

...