Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.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 如何将文件作为输入并忽略新行字符_Perl_Bioinformatics - Fatal编程技术网

Perl 如何将文件作为输入并忽略新行字符

Perl 如何将文件作为输入并忽略新行字符,perl,bioinformatics,Perl,Bioinformatics,以下是fasta文件A的内容: >1 PLAARRPRRGKSLAGFESLACSFPVVSRGFLASRSARSLSSEGGTMPDNRQ PRNRQPRIRSGNEPRSAPAMEPDGRGAWAHSRAALDRLEKLLRCSRCTNIL REPVCLGGCEHIFCSNCVSDCIGTGCPVCYTPAWIQDLKINRQLDSMIQL >2 PLWRPAVPDAGRARPVWSRWSAASLWFLKASLLPALRGAFHPKAGRCRIIGS RGTGSRGSAPGTS

以下是fasta文件A的内容:

>1
PLAARRPRRGKSLAGFESLACSFPVVSRGFLASRSARSLSSEGGTMPDNRQ
PRNRQPRIRSGNEPRSAPAMEPDGRGAWAHSRAALDRLEKLLRCSRCTNIL
REPVCLGGCEHIFCSNCVSDCIGTGCPVCYTPAWIQDLKINRQLDSMIQL

>2
PLWRPAVPDAGRARPVWSRWSAASLWFLKASLLPALRGAFHPKAGRCRIIGS
RGTGSRGSAPGTSLVPRPPWNRMVAVPGPTVAPRSTAWRSCCAARVVLTF*E
SLCV*EDVSTSSVVIV*VTALELDVQCVTPRPGYKT*R*ID

>3
TPPLWRPAVPDAGRAWPVSSRWPAASRWFPEASLLPALRGAFHPKAGRCRII
GSRGTGSRGSAPGTSLVPRPPWNRMVAVPGPTVAPRSTAWRSCCAARVVLTF
现在我需要把文件A作为输入,找出1和2,然后是1-3之间存在的不匹配,还需要找出它们之间的核苷酸变化。到目前为止,我已经编写了一个程序,但它不接受fileA作为输入。好心帮忙

我的问题是我需要把文件A作为输入,序列在每51个核苷酸后包含新行字符,我的程序也会考虑新行字符来找出不匹配

节目:

$a=$b=;
@mul=(“$a”,“$b”);

对于($i=0;$i),如果我正确理解了您的问题,那么您可以从命令行读取文件,以便获得不同文件的结果。 在这里,我们读取每一行并获得源代码,然后在chomp之后,将每一行附加到相应的源代码中。然后您可以将任何一行与任何源代码内容进行比较

my $file = $ARGV[0];
open (FILE, $file);
my $file_content;
my $src_indx = 0;
while (my $line = <FILE>){
    chomp $line;
    $line =~ s/^\s+//;


    if ($line =~ /^\>(\d+)/){
        $file_content->{$1} = '';
        $src_indx = $1;

    }else{
        $file_content->{$src_indx} .= $line;
    }
}

print "\n\nComparision of source:  1 and 2\n";
print "------------------------------------\n";
$t = mutate($file_content->{1},$file_content->{2});
print $t;

sub mutate {
    my ($s1,$s2)=@_;
    $temp="";
    for($k=0;$k<length($s1);$k++) {
        $seq1=substr($s1,$k,1);
        $seq2=substr($s2,$k,1);
        if($seq1 ne $seq2) {
            $temp.="[$seq1($k)/$seq2($k)]";
        } 
    }
    return $temp;
}
my$file=$ARGV[0];
打开(文件,$FILE);
我的$file\u内容;
我的$src_indx=0;
while(我的$line=){
chomp$行;
$line=~s/^\s+/;
如果($line=~/^\>(\d+/){
$file_content->{$1}='';
$src_indx=$1;
}否则{
$file\u content->{$src\u indx}.=$line;
}
}
打印“\n\n源1和2的比较\n”;
打印“------------------------------------\n”;
$t=mutate($file\u content->{1},$file\u content->{2});
打印$t;
亚突变{
我的($s1,$s2)=@;
$temp=“”;

对于($k=0;$k),您可能希望阅读段落,这些段落在一行中用两个换行符标记。因此:

use strict;
use warnings;
my(@a);

{
    # Limit the scope in which you reset the $/ variable
    local($/) = "\n\n";
    while (<>)
    {
         s/\n+//gm;  # Remove all newlines
         push @a, $_;
    }
}

# Now your array contains three items with no newlines - process away...
使用严格;
使用警告;
我的(@a);
{
#限制重置$/变量的范围
本地($/)=“\n\n”;
而()
{
s/\n+//gm;#删除所有换行符
按@a,$\ux;
}
}
#现在您的数组包含三个没有换行符的项-处理掉。。。

您的问题是什么?要删除新行字符,可以使用chomp或正则表达式s/\n//g@aki我也尝试过使用chomp…但它没有给出输出..无法解决问题。这是您的实际文件吗(我假设您的文件与上面粘贴的一样)。是在linux还是windows中。请您清楚地解释一下这个问题。这是否类似于,您的文件有三组行,并且在要打印的组之间,匹配的字符数与文件中的字符总数的比率。注意:输入中的换行符可能由“\r\n”标记,而不是“\n”@reinierpost:当然,它们也可以仅用“\r”标记(MacOS 9或更早版本)。如有必要,请进行调整。
use strict;
use warnings;
my(@a);

{
    # Limit the scope in which you reset the $/ variable
    local($/) = "\n\n";
    while (<>)
    {
         s/\n+//gm;  # Remove all newlines
         push @a, $_;
    }
}

# Now your array contains three items with no newlines - process away...