Perl:使用带哈希的正则表达式

时间:2013-09-14 18:55:12

标签: regex perl hash bioinformatics

我无法确定我正在编写的用于分析酵母基因组的子模块中的错误。帮助任何人?

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

2 个答案:

答案 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