我正在尝试对一大批字符串(蛋白质序列)执行基于组成的过滤。我编写了三个子程序来处理它,但是我遇到了两个问题-一个小问题和一个大问题。 小问题是当我使用List::MoreUtils 'pairwise'时,会收到有关仅使用
非常感谢您的回答和建议!
$a
和$b
一次且未初始化它们的警告。 但我认为我已正确调用此方法(基于CPAN的条目和一些来自网络的示例)。 主要问题是出现错误:"Can't use string ("17/32") as HASH ref while "strict refs" in use..."
。这似乎只会在&comp
中的foreach
循环将哈希值作为字符串而不是评估除法运算时发生。 我确定我犯了初学者的错误,但找不到答案。即使是上周三我第一次看Perl代码...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;
}
非常感谢您的回答和建议!