Я пытаюсь понять конкретный код Perl из vcake. Обычно я нахожусь в Perl, но следующее утверждение меня сбивает с толку. Я подозреваю, что это просто ошибка, но я не совсем уверен. Утверждение:
foreach my $seq (keys %$set) {
if ( (defined $set->{$seq}) and (my $numReads >= ($coverage)) ) {
do something;
}
...
}
$coverage был определен в начале файла как скалярное целое число (например, 10) и больше никогда не записывается. $numReads используется только в строке выше нигде более!
$set, с другой стороны, модифицируется внутри цикла, поэтому первая часть условия имеет смысл. Я не понимаю вторую часть, потому что, как я ее вижу, она всегда будет оценивать одно и то же значение и Я не понимаю значения $numReads или >= здесь. Может ли кто-нибудь просветить меня? Возможно, задействованы невидимые автоматические переменные?





my $numReads означает: Создать новую локальную переменную в контексте цикла foreach. Его начальное значение - undef, которое в числовом контексте трактуется как 0.
Итак, код гласит:
if ((...) and (0 >= ($coverage)) ) {
}
что означает, что «сделать что-нибудь» никогда не будет выполняться, если для $ покрытия не установлено значение 0 или меньше.
Если бы это был код отладки, я бы предположил, что для включения / отключения этого оператора используется $ охват.
Я предполагаю: вы нашли ошибку.
Фактически, значение $ numReads меньше, что в числовом контексте считается нулевым.
Можно также отметить, что если $ set не является ссылкой на% set или какой-либо другой хэш, имитирующий структуру% set, тогда строка
foreach my $seq (keys %set)
Не соответствует условию
defined $set->{$seq}
Поскольку $ set -> {$ seq} разыменовывает ссылку на хэш, а% set является хешем. Более вероятно, что это вторая ошибка, чем то, что кто-то создал экземпляры как набора% хэша, так и скалярного набора $ с помощью hashref.
Спасибо, что заметили, но это была просто опечатка, когда я упростил код для публикации. Я исправил это сейчас: $seq действительно является ссылкой на хеш.
Вы имеете в виду «лексическую» переменную, потому что Perl, к сожалению, имеет другое значение для «локального» :)