Estoy tratando de realizar algunos filtros basados en la composición en una gran colección de cadenas (secuencias de proteínas).
Escribí un grupo de tres subrutinas para encargarme de ello, pero estoy teniendo problemas de dos maneras: una menor, una mayor. El problema menor es que cuando uso List::MoreUtils 'pairwise' recibo advertencias sobre el uso de $a
y $b
solo una vez y no se inicializan. Pero creo que estoy llamando a este método correctamente (basado en la entrada de CPAN y algunos ejemplos de la web).
El principal problema es un error "Can't use string ("17/32") as HASH ref while "strict refs" in use..."
¿Por qué esta sentencia se trata como una cadena en lugar de su resultado?
Parece que esto sólo puede ocurrir si el bucle foreach
en &comp
está dando los valores de hash como una cadena en lugar de evaluar la operación de división. Estoy seguro de haber cometido un error de novato, pero no puedo encontrar la respuesta en la web. La primera vez que miré el código perl fue el miércoles pasado ...
use List::Util;
use List::MoreUtils;
my @alphabet = (
'A', 'R', 'N', 'D', 'C', 'Q', 'E', 'G', 'H', 'I',
'L', 'K', 'M', 'F', 'P', 'S', 'T', 'W', 'Y', 'V'
);
my $gapchr = '-';
# Takes a sequence and returns letter => occurrence count pairs as hash.
sub getcounts {
my %counts =();
foreach my $chr (@alphabet) {
$counts{$chr} = ($_[0] =~ tr/$chr/$chr/);
}
$counts{'gap'} = ($_[0] =~ tr/$gapchr/$gapchr/);
return %counts;
}
# Takes a sequence and returns letter => fractional composition pairs as a hash.
sub comp {
my %comp = getcounts($_[0]);
foreach my $chr (@alphabet) {
$comp{$chr} = $comp{$chr}/(length($_[0]) - $comp{'gap'});
}
return %comp;
}
# Takes two sequences and returns a measure of the composition difference between them, as a scalar.
# Originally all on one line but it was unreadable.
sub dcomp {
my @dcomp = pairwise { $a - $b } @{ values(%{ comp($_[0]) }) }, @{ values(%{ comp($_[1]) }) };
@dcomp = apply { $_ ** 2 } @dcomp;
my $dcomp = sqrt(sum(0, @dcomp))/20;
return $dcomp;
}
¡Muchísimas gracias por cualquier respuesta o consejo!
Vea también http://stackoverflow.com/questions/2261871/whats-the-point-of-use-vars-in-this-perl-subroutine/2261957#2261957 para obtener más explicaciones de por qué/cómo estas cosas sucede. +1 – DVK
¿En qué línea está ese error de ref hash? – DVK
Para el problema menor, vea http://stackoverflow.com/questions/1490505/how-do-i-prevent-listmoreutils-from-warning-about-using-a-and-b-only-once. – FMc