O que isso Perl condicional fazer?
-
11-07-2019 - |
Pergunta
Eu estou tentando entender um código Perl em particular de vcake . Normalmente eu achar meu caminho em Perl, mas os seguintes defletores afirmação me. Eu suspeito que este é simplesmente um erro, mas eu não estou completamente certo. A declaração é:
foreach my $seq (keys %$set) {
if( (defined $set->{$seq}) and (my $numReads >= ($coverage)) ) {
do something;
}
...
}
$coverage
foi definido no início do arquivo como um inteiro escalar (por exemplo, 10) e nunca é novamente escrito. $numReads
só é usado na linha acima, nenhum outro lugar !
$set
, por outro lado, é modificada dentro do loop para a primeira parte da condição faz todo o sentido. O que eu não entendo é a segunda parte, porque a meu ver, isso vai sempre avaliar com o mesmo valor e Eu não entendo o significado de $numReads
ou >=
aqui . Alguém por favor pode me esclarecer? São variáveis ??automáticas lá talvez invisíveis envolvidos?
Solução
meios my $numReads
: Criar uma nova variável local no contexto do circuito foreach
. O seu valor inicial é undef
, que no contexto numérica é tratado como 0
.
Assim, o código lê:
if ((...) and (0 >= ($coverage)) ) {
}
que significa "fazer algo" nunca é executado a menos que $ cobertura é definido como 0 ou menos.
Se este era um código de depuração, eu supor que US $ cobertura é usado para ativar / desativar esta declaração.
Meu palpite é:. Você encontrou um bug
Outras dicas
Pode-se também notar que a menos que $ set é uma referência ao conjunto%, ou algum outro hash que imita a estrutura do conjunto%, então a linha
foreach my $seq (keys %set)
Não corresponde a condição
defined $set->{$seq}
Desde $ set -> {$ seq} dereferences um ref hash e% conjunto é um hash. É mais provável que este é um segundo bug do que é que alguém tenha instanciado tanto a% conjunto de hash e os US $ set escalar com um hashref.