Sto cercando di eseguire un filtro basato su composizione su una vasta raccolta di stringhe (sequenze di proteine).
Ho scritto un gruppo di tre subroutine per occuparmene, ma mi trovo nei guai in due modi: uno minore, uno maggiore. Il guaio minore è che quando uso List::MoreUtils 'pairwise' ricevo avvertenze sull'utilizzo di $a
e $b
una sola volta e che non sono inizializzate. Ma credo che sto chiamando questo metodo correttamente (basato sulla voce di CPAN per esso e alcuni esempi dal web).
Il problema principale è un errore "Can't use string ("17/32") as HASH ref while "strict refs" in use..."
Perché questa istruzione viene considerata come una stringa invece del suo risultato?
Sembra che questo può avvenire solo se il loop foreach
in &comp
dà i valori hash come una stringa invece di valutare l'operazione di divisione. Sono sicuro di aver commesso un errore da principiante, ma non riesco a trovare la risposta sul web. La prima volta che ho visto il codice perl era lo scorso mercoledì ...
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;
}
Molto apprezzamento per qualsiasi risposta o consiglio!
Si prega di consultare anche http://stackoverflow.com/questions/2261871/whats-the-point-of-use-vars-in-this-perl-subroutine/2261957#2261957 per ulteriori spiegazioni sul perché/come questa roba accade. +1 – DVK
Su quale riga si trova l'errore di hash hash? – DVK
Per il problema minore, vedere http://stackoverflow.com/questions/1490505/how-do-i-prevent-listmoreutils-from-warning-about-using-a-and-b-only-once. – FMc