我无法确定我正在编写的用于分析酵母基因组的子模块中的错误。帮助任何人?
sub应该使用散列键作为正则表达式来检查某对大写字母。如果我们匹配,则返回关联的值。但是,它似乎只匹配“TT”并返回值5.我不知道它为什么会跳转到TT哈希元素;其他一切似乎在不同元素之间是相同的。我认为它会返回每个值,或者没有,但它只返回TT。
完整的代码在github上:https://github.com/bsima/yeast-TRX
以下是相关代码(script.pl的第159行):
sub trxScore {
my ( $dinucleotide ) = @_;
my %trxScores = (
qr/(CG)/ => 43,
qr/(CA)/ => 42,
qr/(TG)/ => 42,
qr/(GG)/ => 42,
qr/(CC)/ => 42,
qr/(GC)/ => 25,
qr/(GA)/ => 22,
qr/(TC)/ => 22,
qr/(TA)/ => 14,
qr/(AG)/ => 9,
qr/(CT)/ => 9,
qr/(AA)/ => 5,
qr/(TT)/ => 5,
qr/(AC)/ => 4,
qr/(GT)/ => 4,
qr/(AT)/ => 0
);
foreach my $re (keys %trxScores) {
if ( match($re,$dinucleotide) ) {
return $trxScores{$re};
} else {
return "null";
}
}
}
输出位于bayanus-TRXscore.csv:
Saccharomyces bayanus
gene,gene pair,position,trx score
...
eYAL001C,TA,23,null
eYAL001C,AT,24,null
eYAL001C,TT,25,5
eYAL001C,TT,26,5
eYAL001C,TT,27,5
eYAL001C,TA,28,null
答案 0 :(得分:3)
你总是在第一次尝试匹配时返回,这将是哈希中的第一个键(一般来说这是一个未定义的顺序,但是考虑到完全相同的哈希结构,以及相同版本的Perl,你将倾向于访问按键顺序相同)。如果不匹配,则代码返回“null”,并且不会尝试另一个循环。 return
命令将退出trxScore sub
,为任何称为它的Perl代码提供值 - return
将立即(通常干净地)结束{{1}内的所有循环和代码块}}
按如下方式更改循环:
sub
这将使foreach my $re (keys %trxScores) {
if ( match($re,$dinucleotide) ) {
return $trxScores{$re};
}
}
return "null";
仅在代码尝试与哈希中的所有键匹配后发生。
答案 1 :(得分:2)
为什么你甚至使用正则表达式?它看起来像你只是在进行字符串匹配。另外,为什么你有哈希?看起来您希望按特定顺序匹配字符串,并且散列键不会按任何顺序保存。
$ cat foo.pl
#!/usr/bin/perl
use strict;
use warnings;
# Note that this is an ordered array of matcher and scores, not a hash.
my @trxScores = (
CG => 43,
CA => 42,
TG => 42,
GG => 42,
CC => 42,
GC => 25,
GA => 22,
TC => 22,
TA => 14,
AG => 9,
CT => 9,
AA => 5,
TT => 5,
AC => 4,
GT => 4,
AT => 0
);
my $dinucleotide = 'GTACTTAAGCTATTGGAGC';
my $found;
while ( my ($matcher,$score) = splice( @trxScores, 0, 2 ) ) {
print "Trying to match $matcher for a score of $score\n";
if ( index( $dinucleotide, $matcher ) > -1 ) {
print "Found $matcher for a score of $score\n";
$found = 1;
last;
}
}
if ( !$found ) {
print "Couldn't find any matches\n";
}
$ perl foo.pl
Trying to match CG for a score of 43
Trying to match CA for a score of 42
Trying to match TG for a score of 42
Found TG for a score of 42