2011-03-07 67 views
0

以下是FASTA的fileA的內容:如何把文件作爲輸入,並忽略新行字符

>1 
PLAARRPRRGKSLAGFESLACSFPVVSRGFLASRSARSLSSEGGTMPDNRQ 
PRNRQPRIRSGNEPRSAPAMEPDGRGAWAHSRAALDRLEKLLRCSRCTNIL 
REPVCLGGCEHIFCSNCVSDCIGTGCPVCYTPAWIQDLKINRQLDSMIQL 

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

>3 
TPPLWRPAVPDAGRAWPVSSRWPAASRWFPEASLLPALRGAFHPKAGRCRII 
GSRGTGSRGSAPGTSLVPRPPWNRMVAVPGPTVAPRSTAWRSCCAARVVLTF 

現在我需要採取的fileA作爲輸入,並找出1和2之間存在的不匹配然後1-3並找出它們之間的核苷酸變化。到目前爲止,我已經編寫了一個程序,但它並沒有將fileA作爲輸入。好心幫

我的問題是我需要的fileA給予作爲輸入,以及含有序列換行字符每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)[email protected]_; 
    $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; 
} 
+0

你的問題是什麼呢? – Gabe 2011-03-07 06:46:31

+0

要刪除您可以使用格格新行字符或使用正則表達式S/\ n // g^ – SAN 2011-03-07 06:58:56

+0

@aki我嘗試使用格格太...但它不是得到安寧輸出..無法找出問題。 – supratim 2011-03-07 07:00:58

回答

0

如果我明白你的問題正確,那麼這裏就是你可以做什麼來讀取命令行的文件,這樣就可以得到不同的文件的結果。 這裏我們讀到的每一行,並得到信源數,然後格格之後,每一行附加到相應的源。那麼你可以將任何行與任何源內容進行比較。

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)[email protected]_; 
    $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中得到更好的控制。

讓我知道這是不是你想要的。

1

你可能想閱讀的段落,這是由一排兩個新行標。因此:

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

警告:輸入中的換行符可能標記爲「\ r \ n」而非「\ n」。 – reinierpost 2011-03-07 08:59:58

+0

@reinierpost:當然;它們也可以用'\ r'標記(MacOS 9或更早版本)。如有必要適應。 – 2011-03-07 13:25:51