Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/apache/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Perl计算fasta文件中的核苷酸频率_Perl_Fasta - Fatal编程技术网

使用Perl计算fasta文件中的核苷酸频率

使用Perl计算fasta文件中的核苷酸频率,perl,fasta,Perl,Fasta,请帮助改进以下代码。我无法在一行中打印序列。希望将输出打印成四行,每行的核苷酸频率为四个字符中的一个。提前感谢。在此处输入代码 #!/usr/bin/perl use strict; use warnings; my $A; my $T; my $G; my $C; my $fileIN; my $fileOUT; my $seq ; open ($fileIN, "basecount.nfasta") or die "can't open file "; open ($fileOUT

请帮助改进以下代码。我无法在一行中打印序列。希望将输出打印成四行,每行的核苷酸频率为四个字符中的一个。提前感谢。
在此处输入代码

#!/usr/bin/perl
use strict;
use warnings;
my $A;    
my $T;
my $G;
my $C;
my $fileIN;
my $fileOUT;

my $seq ;
open ($fileIN, "basecount.nfasta") or die "can't open file ";
open ($fileOUT, ">basecount.out") or die "can't open file ";

while (<$fileIN>)
{

             if ($_ =~/^>/)  #ignore header line
             {next;}

             else
                   {
                    $seq  = $_; #copy the all line with only nucleotide characters ATGC
                   }
            $seq  =~ s/\n//g; #create one single line containing all ATGC characters

             print "$seq\n"; # verify previous step

             my @dna = split ("",$seq); #create an array to include each nucleotide as array element

             foreach my $element (@dna)

            {
            if ($element =~/A/) # match nucleotide pattern and countstrong text
                            {
                             $A++;
                            }
             if ($element =~/T/)
                            {
                             $T++;
                            }
             if ($element =~/G/)
                            {
                             $G++;
                            }
             if ($element =~/C/)
                            {
                             $C++;
                            }

            }

            print $fileOUT "A=$A\n";
            print $fileOUT "T=$T\n";
            print $fileOUT "G=$G\n";
            print $fileOUT "C=$C\n";
}

close ($fileIN);
close ($fileOUT);
#/usr/bin/perl
严格使用;
使用警告;
我的一美元;
我的$T;
我的$G;
我的$C;
我的$fileIN;
我的$fileOUT;
我的$seq;
打开($fileIN,“basecount.nfasta”)或死亡“无法打开文件”;
打开($fileOUT,“>basecount.out”)或死“无法打开文件”;
而()
{
如果($)#忽略标题行
{next;}
其他的
{
$seq=$\u;\ ATGC仅复制包含核苷酸字符的所有行
}
$seq=~s/\n//g;#创建一行,其中包含所有ATGC字符
打印“$seq\n”#验证上一步
my@dna=split(“,$seq)#创建一个数组,将每个核苷酸作为数组元素包含在内
foreach my$元素(@dna)
{
如果($element=~/A/)#匹配核苷酸模式和countstrong文本
{
$A++;
}
如果($element=~/T/)
{
$T++;
}
如果($element=~/G/)
{
$G++;
}
如果($element=~/C/)
{
$C++;
}
}
打印$fileOUT“A=$A\n”;
打印$fileOUT“T=$T\n”;
打印$fileOUT“G=$G\n”;
打印$fileOUT“C=$C\n”;
}
关闭($fileIN);
结案(分档);;

首先,我会使用一些快捷方式。更容易阅读:

use strict;
use warnings;
use feature 'say';
my $A;
my $T;
my $G;
my $C;
my $fileIN;
my $fileOUT;

open $fileIN,  '<',"basecount.nfasta" or die "can't open file basecount.nfasta for reading";
open $fileOUT, '>','basecount.out' or die "can't open file basecount.out for writing";

while ( my $seq = <$fileIN> ) {

  next if $seq =~ /^>/;
  $seq =~ s/\n//g;
  say $seq;

  my @dna = split //, $seq;

  foreach my $element ( @dna ) {
    $A++ if $element =~ m/A/;
    $T++ if $element =~ m/T/;
    $G++ if $element =~ m/G/;
    $C++ if $element =~ m/C/;
  }

  say $fileOUT "A=$A";
  say $fileOUT "T=$T";
  say $fileOUT "G=$G";
  say $fileOUT "C=$C";
}

close $fileIN;
close $fileOUT;
使用严格;
使用警告;
使用特征“说”;
我的一美元;
我的$T;
我的$G;
我的$C;
我的$fileIN;
我的$fileOUT;

打开$fileIN,'到底是什么问题?如果要获得所有行的频率,只需将打印语句移出循环谢谢,将打印语句移出循环就行了。我关心的是,尽管我已替换了\n字符,为什么我仍然在多行中看到核苷酸,而不是在一行中?因为你在用while语句逐行读取文件。如果要读取标量中的所有行,需要使其不同。例如,使用file::slurp模块(在google中有更多的方法可以找到它们),似乎您只需要文件中所有序列的总核苷酸频率。这里有一行代码可以做到这一点:
perl-076-ne'chomp;s/+?\n/$h{$1}++while/(A | T | C | G)/G;结束{print“$\=$h{$\}\n”对于键%h}'infle.fa[>outFile.out]
最后一个可选参数将输出定向到文件。感谢改进;特别是"说",;这很有帮助。