как принять файл в качестве ввода и игнорировать символ новой строки - PullRequest
0 голосов
/ 07 марта 2011

Ниже приводится содержимое файла fastaA:

>1
PLAARRPRRGKSLAGFESLACSFPVVSRGFLASRSARSLSSEGGTMPDNRQ
PRNRQPRIRSGNEPRSAPAMEPDGRGAWAHSRAALDRLEKLLRCSRCTNIL
REPVCLGGCEHIFCSNCVSDCIGTGCPVCYTPAWIQDLKINRQLDSMIQL

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

>3
TPPLWRPAVPDAGRAWPVSSRWPAASRWFPEASLLPALRGAFHPKAGRCRII
GSRGTGSRGSAPGTSLVPRPPWNRMVAVPGPTVAPRSTAWRSCCAARVVLTF

Теперь мне нужно взять файл A в качестве входных данных и выяснить наличие несоответствий между 1 и 2, а затем 1-3, а также выяснить изменение нуклеотидов между ними. Пока я написал программу, но она не принимает файл A в качестве входных данных. любезно помогите

Моя проблема в том, что мне нужно, чтобы файл A был задан в качестве входных данных, а последовательности содержат символ новой строки после каждых 51 нуклеотида, и моя программа учитывает символ новой строки также для обнаружения несоответствий.

Программа:

$a=<>;$b=<>;
@mul=("$a","$b");

for($i=0;$i<scalar(@mul)-1;$i++) {
    $source=$mul[$i];
    print "\n\nComparision of source:  $mul[$i]\n";
    print "------------------------------------";
    for($j=$i+1;$j<scalar(@mul);$j++) {
        $sample=$mul[$j];
        print "\n$sample ";
        print "\n------\n";
        $t=mutate($source,$sample);
        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;
}

Ответы [ 2 ]

1 голос
/ 07 марта 2011

Вы, вероятно, хотите прочитать абзацы, которые отмечены двумя символами новой строки подряд. Следовательно:

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...
0 голосов
/ 07 марта 2011

Если я правильно понял вашу проблему, то вот что вы можете сделать, чтобы прочитать файл из командной строки, чтобы получить результаты для разных файлов.Здесь мы читаем каждую строку и получаем номер источника, затем после 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;
}

Я не изменял вашу функцию mutate.Если вы используете регулярное выражение или split вместо substr, вы также можете получить лучший контроль в mutate.

Дайте мне знать, если это не то, что вам нужно.

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