0

このコードを単純化または一般化する方法を誰かが知っているかどうか疑問に思っていました。正しい答えが得られますが、現在の状況にのみ適用されます。私のコードは次のとおりです。

sub longestRepeat{
                                # list of argument @_ is: (sequence, nucleotide)
  my $someSequence = shift(@_);  # shift off the first  argument from the list
  my $whatBP       = shift(@_);  # shift off the second argument from the list
  my $match = 0;



        if ($whatBP eq "AT"){
            if ($someSequence =~ m/(([A][T])\2\2\2\2\2)/g) {

            $match = $1
            }
            return $match;

        }
        if ($whatBP eq "TAGA"){
            if ($someSequence =~ m/(([T][A][G][A])\2\2)/g) {

            $match = $1
            }
            return $match;
        }

        if ($whatBP eq "C"){
            if ($someSequence =~ m/(([C])\2\2)/g) {

            $match = $1
            }
            return $match;
        }
}   

私の質問は、2 番目の if ステートメントで、そのパターンが繰り返される一定量に設定されていることです (指定された文字列に適用されます)。しかし、\2 (パターンの繰り返し) を検索するために while ループを実行し続ける方法はありますか? 私が言いたいのは、これができるかということです: if ($someSequence =~ m/(([A][T])\2\2\2\2\2)/g) は while ループで単純化され、一般化されます

4

1 に答える 1

0

サブルーチンの名前に基づいて、シーケンス内で最も長い繰り返しシーケンスを見つけたいと考えています。

だとしたら、以下はどうでしょう。

sub longest_repeat {

    my ( $sequence, $what ) = @_;

    my @matches = $sequence =~ /((?:$what)+)/g ;  # Store all matches

    my $longest;
    foreach my $match ( @matches ) {  # Could also avoid temp variable :
                                      # for my $match ( $sequence =~ /((?:$what)+)/g )

        $longest //= $match ;         # Initialize
                                      #  (could also do `$longest = $match
                                      #                    unless defined $match`)

        $longest = $match if length( $longest ) < length( $match );
    }

    return $longest;  # Note this also handles the case of no matches
}

それを理解できれば、次のバージョンは基本的にシュワルツ変換で同じ機能を実現します。

sub longest_repeat {

    my ( $sequence, $what ) = @_;                          # Example:
                                                           # --------------------
    my ( $longest ) = map { $_->[0] }                      # 'ATAT' ...
                        sort { $b->[1] <=> $a->[1] }       # ['ATAT',4], ['AT',2]
                          map { [ $_, length($_) ] }       # ['AT',2], ['ATAT',4]
                            $sequence =~ /((?:$what)+)/g ; # ... 'AT', 'ATAT'

    return $longest ;
}

代わりにあるsortので無駄だと主張する人もいるかもしれませんが、あなたには多様性があります。O(n.log(n))O(n)

于 2013-11-14T04:52:38.607 に答える