Выход подпрограммы возвращает 0 - PullRequest
0 голосов
/ 16 мая 2018

Я написал скрипт, который использует подпрограмму для вызова процента нуклеотидов в данной последовательности. Когда я запускаю скрипт, вывод для каждого процента нуклеотидов всегда показан равным нулю.

Вот мой код;

#!/usr/bin/perl
use strict;
use warnings;

#### Subroutine to report percentage of each nucleotide in DNA sequence ####

my $input = $ARGV[0];
my $nt = $ARGV[1];
my $args = $#ARGV +1;

if($args != 2){
    print "Error!!! Insufficient number of arguments\n";
    print "Usage: $0 <input fasta file>\n";
}

my($FH, $line);

open($FH, '<', $input) || die "Could\'nt open file: $input\n";

$line = do{
    local $/;
    <$FH>;
};

$line =~ s/>(.*)//g;
$line =~ s/\s+//g;

my $perc = perc_nucleotide($line , $nt);
printf("The percentage of $nt nucleotide in given sequence is %.0f", $perc);
print "\n";


sub perc_nucleotide {
    my($line, $nt) = @_;
    print "$nt\n";
    my $count = 0;
    if( $nt eq "A" || $nt eq "T" || $nt eq "G" || $nt eq "C"){
    $count++;
    }
    my $total_len = length($line);
    my $perc = ($count/$total_len)*100;

}

Я думаю, что неправильно устанавливаю переменную $count. Я пробовал разные способы, но не могу понять это.

Это входной файл

>XM_024894547.1 Trichoderma citrinoviride Redoxin (BBK36DRAFT_1163529), partial mRNA
ATGGCCTTCCGTCTCCCTCTGCGCCGCATTGCCCTGGCCCGCCCCGCCACCGTTGCGCGTGGCTTCCACT
CGACGCCCCGCGCCCTGGTCAAGGTCGGCGACGAGGTCCCGAGCTTGGAGCTGTTCGAGAAGTCGGCCGC
CAGCAAGATCAACCTGGCCGACGAGTTCAAGAAGGGCGACGGCTACATTGTCGGCGTCCCGGGCGCCTTC
TCCGGCACCTGCTCCGGCACCCACGTCCCGTCGTACATCAACCACCCTGACATCAAGACGGCCGGCCAGG
TCTTTGTCGTCTCCGTCAACGACCCCTTTGTCATGAAGGCTTGGGCAGACCAGCTGGATCCCGCCGGAGA
GACAGGAATCCGGTTCGTTGCCGACCCCACGGCTGAGTTCACAAAGGCTCTGGAACTGGGATTCGACGAC
GCTGCTCCTCTGTTCGGAGGCACCCGAAGCAAGCGCTATGCTCTCAAGGTTAAGGATGGCAAGGTCACTG
CCGCCTTTGTTGAGCCCGACAACACGGGCACTTCCGTGTCAATGGCCGACAAGGTCCTCAGCTAA

Ответы [ 2 ]

0 голосов
/ 17 мая 2018

Я исправил сценарий, и он дал мне правильные ответы.

#!/usr/bin/perl
use strict;
use warnings;

##### Subroutine to calculate percentage of all nucleotides in a DNA sequence #####

my $input = $ARGV[0];
my $nt = $ARGV[1];
my $args = $#ARGV + 1;

if($args != 2){
    print "Error!!! Insufficient number of arguments\n";
    print "Usage: $0 <input_fasta_file> <nucleotide>\n";
}

my($FH, $line);

open($FH, '<', $input) || die "Couldn\'t open input file: $input\n";

$line = do{
    local $/;
    <$FH>;
};

chomp $line;

#print $line;

$line =~ s/>(.*)//g;
$line =~ s/\s+//g;

#print "$line\n";

my $total_len = length($line);
my $perc_of_nt = perc($line, $nt);

**printf("The percentage of nucleotide $nt in a given sequence is %.2f%%", $perc_of_nt);
print "\n";**


#print "$total_len\n";

sub perc{
    my($line, $nt) = @_;
    my $char; my $count = 0;
    **foreach $char (split //, $line){
    if($char eq $nt){
        $count += 1;
    }
    }** 
**return (($count/$total_len)*100)**
}

Ответ на указанный выше входной файл:

Total_len = 555
The percentage of nucleotide A in a given sequence is 18.02%
The percentage of nucleotide T in a given sequence is 18.74%
The percentage of nucleotide G in a given sequence is 28.47%

Изменения, которые я сделал, выделены жирным шрифтом.

Спасибо за удивительную проницательность !!!

0 голосов
/ 16 мая 2018

Проблема здесь:

my $perc = perc_nucleotide($line , $nt);
printf("The percentage of $nt nucleotide in given sequence is %.0f", $perc);

perc_nucleotide возвращает 0.18018018018018, но формат %.0f говорит, что нужно напечатать его без десятичных знаков.Таким образом, оно усекается до 0. Вы, вероятно, должны использовать что-то более похожее на %.2f.


Стоит также отметить, что perc_nucleotide не имеет return.Это все еще работает, но по причинам, которые могут быть не очевидны.

perc_nucleotide устанавливает my $perc = ($count/$total_len)*100;, но никогда не использует это $perc.$perc в основной программе - это другая переменная.

perc_nucleotide что-то возвращает, каждая подпрограмма Perl без явного возврата возвращает «последнее вычисленное выражение».В этом случае это my $perc = ($count/$total_len)*100;, но последние оцененные правила выражения могут быть немного хитрыми.

Проще читать и безопаснее иметь явный возврат.return ($count/$total_len)*100;

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...