use strict; use warnings; my @instances = qw ( AAAAA ATCGA ATAAA ); my @instances2 = qw ( AAAAA AACGA ATAAA ATAAA ); print consensus(@instances),"\n"; sub consensus{ my @mi = @_; my $motif_count=0; my @words =(); my $L = undef; my @A = (); my @T = (); my @C = (); my @G = (); my $a = 0; my $c = 0; my $g = 0; my $t = 0; my $w = 0; foreach my $mi ( @mi ) { chomp($mi); $mi =~ s/\s//g; $w = length($mi); #for motif instances count @words = split( /\W+/, $mi ); $motif_count += @words; } for ( my $j = 0 ; $j < $w ; $j++ ) { # Initialize the base counts. my $L =0; foreach my $mi ( @mi ) { chomp($mi); my $L = $mi; my $sb = substr( $L, $j, 1 ); while ( $sb =~ /a/ig ) { $a++ } while ( $sb =~ /t/ig ) { $t++ } while ( $sb =~ /c/ig ) { $c++ } while ( $sb =~ /g/ig ) { $g++ } } push( @A, $a ); push( @T, $t ); push( @C, $c ); push( @G, $g ); $a = 0; $c = 0; $g = 0; $t = 0; } my @cons = (); #print "$w\n"; for (my $b=0; $b <$w ;$b++) { if ( $A[$b] > $T[$b] && $A[$b] > $C[$b] && $A[$b] > $G[$b] ) { push( @cons, 'A'); } elsif ( $T[$b] > $C[$b] && $T[$b] > $A[$b] && $T[$b] > $G[$b] ) { push( @cons, 'T' ); } elsif ( $C[$b] > $G[$b] && $C[$b] > $A[$b] && $C[$b] > $T[$b] ) { push( @cons, 'C' ); } elsif ( $G[$b] > $A[$b] && $G[$b] > $C[$b] && $G[$b] > $T[$b] ) { push( @cons, 'G' ); } elsif ( $A[$b] = $T[$b] ) { push( @cons, 'T' ); } elsif ( $A[$b] = $G[$b] ) { push( @cons, 'G' ); } elsif ( $A[$b] = $C[$b] ) { push( @cons, 'C' ); } elsif ( $T[$b] = $C[$b] ) { push( @cons, 'C' ); } elsif ( $T[$b] = $G[$b] ) { push( @cons, 'G' ); } else { push @cons, 'G'; } } return @cons; }