1

私は文字列を持っています

$seq1= 'ATCGATGCAATTCCGGAAAAAATTTTCCCGGGGGGGAAACCCGGGAAATTT'

したがって、この文字列のユーザー入力から char の頻度を見つけたいと思います。

だから私はこの文字列を配列に変更します

$base= <STDIN>;  # you can input A or T or C or G
my @Freq1= split //, $seq1;

次に、 for ループを使用して char の総数を計算します

for(my $i=0;$i<@Freq1;$i++) {
  if($Freq1[$i] eq chomp($base)) {
    print "equals $i\n";
    $numberbase++;
  }
}

しかし、$Freq1[$i] eq chomp($base)うまくいきません。どうしてか分かりません?

4

6 に答える 6

3

chompは削除された文字の合計を返すので、入力を chomp して直接比較するだけです。

chomp($base);
for(my $i=0;$i<@Freq1;$i++)
{
    if($Freq1[$i] eq $base)
    {
        print "equals $i\n";
        $numberbase++;
    }
}
于 2013-09-29T09:50:38.643 に答える
2

このタスクには文字変換を使用することもできます。これは、すべてのベースをループするよりも高速になる可能性があります。

#!/usr/bin/env perl                                                                                                                                                       

use strict;
use warnings;

my $seq = 'ATCGATGCAATTCCGGAAAAAATTTTCCCGGGGGGGAAACCCGGGAAATTT';
my $count = ($seq =~ tr/Aa//);
print "A is seen $count times.\n";

または、BioPerl を使用してシーケンス統計を取得することもできます。

#!/usr/bin/env perl

use strict;
use warnings;
use Bio::Tools::SeqStats;

my $seqobj = Bio::PrimarySeq->new( -seq => 'ATCGATGCAATTCCGGAAAAAATTTTCCCGGGGGGGAAACCCGGGAAATTT',
                                   -alphabet => 'dna',
                                   -id => 'test' );

my $seq_stats = Bio::Tools::SeqStats->new( -seq => $seqobj );
my $hash_ref = $seq_stats->count_monomers();

for my $base (sort keys %$hash_ref) {
    print "Number of bases of type ", $base, " = ", $hash_ref->{$base},"\n";  
}

出力:

Number of bases of type A = 16
Number of bases of type C = 10
Number of bases of type G = 14
Number of bases of type T = 11
于 2013-09-29T21:08:59.070 に答える
1

すべてのカウントを表示しない理由はありません。

ハッシュを使用して 4 つの塩基すべてのカウントを保持し、その後その内容をループで表示します。

use strict;
use warnings;

my $seq1 = 'ATCGATGCAATTCCGGAAAAAATTTTCCCGGGGGGGAAACCCGGGAAATTT';

my %counts;
$counts{$_} += 1 for split //, $seq1;

printf "%s => %d\n", $_, $counts{$_} // 0 for qw/ A C G T /;

出力

A => 16
C => 10
G => 14
T => 11
于 2013-09-29T22:48:05.053 に答える
0

文字列内の部分文字列の出現をカウントしたい場合は、いわゆる「ヤギの演算子」 =()=を使用できます(これは、真ん中に括弧のセットがある 2 つの等号です)。

use strict;
use warnings;

my $seq1 = 'ATCGATGCAATTCCGGAAAAAATTTTCCCGGGGGGGAAACCCGGGAAATTT';
chomp(my $base = <>);  # user input
my $count = () = $seq1 =~ /$base/g;
print "$base is seen $count times in the sequence\n";

Aたとえば、これは 16 のカウントを出力します。

/gこれが機能する方法は、コンテキストに応じて、修飾子を持つ正規表現がリストまたはイテレータのいずれかを返すことができるということです。リストが必要なので、リスト コンテキストを課します。これは、空の括弧が行うことです。次に、$count変数の割り当てにより、リストにスカラー コンテキストが課されます。この場合、その要素の数が返されます。

于 2013-09-29T11:18:24.377 に答える