0

BLAST コマンドを perl スクリプトに結合するときに行き詰まりました。問題は、PART II の開始時にコマンド ラインが一時停止することです。

パート I は、fasta シーケンスをトリミングするために使用されます。PART II は、PART I で生成されたファイルを使用して BLAST を実行するために使用されます。2 つの部分はどちらも個別に実行できますが、組み合わせると「一時停止」の問題が発生します。

パート I で生成された $ARGV[1] と $ARGV[3] がパート II で使用できないためだと思います。いろいろ試したのに直し方がわからない。

ありがとう!

#! /usr/bin/perl -w
use strict;


#### PART I
die "usage:4files fasta1 out1 fasta2 out2\n" unless @ARGV==4;

open (S, "$ARGV[0]") || die "cannot open FASTA file to read: $!";
open OUT,">$ARGV[1]" || die "no out\n";
open (S2, "$ARGV[2]") || die "cannot open FASTA file to read: $!";
open OUT2,">$ARGV[3]" || die "no out2\n";

my %s;# a hash of arrays, to hold each line of sequence
my %seq; #a hash to hold the AA sequences.
my $key;

print "how long is the N-terminal(give number,e.g. 30. whole length input \"0\") \n";
chomp(my $nl=<STDIN>);
##delete "\n" for seq.

local $/ = ">";
<S>;
while (<S>){ #Read the FASTA file.
    chomp;
    my @line=split/\n/;
    print OUT ">",$line[0],"\n";
    splice @line,0,1;
    #print OUT join ("",@line),"\n";
    #@line = join("",@line);
    #print @line,"\n";
    if ($nl == 0){ #whole length
        my $seq=join("",@line);
        my @amac = split(//,$seq);
        splice @amac,0,1; # delete first "MM"
        #push @{$s{$key}},@amac;
        print OUT @amac,"\n";
        }
        else { # extract inital aa by number ##Guanhua
        my $seq=join("",@line);
        #print $seq,"\n";
        my @amac = split(//,$seq);
        splice @amac,0,1; # delete first "MM"
        splice @amac,$nl; ##delete from the N to end
        #print @amac,"\n";
            #push (@{$s{$key}}, @amac);
        print OUT @amac,"\n";
        }

    }
<S2>;
while (<S2>){ #Read the FASTA file.
    chomp;
    my @line=split/\n/;
    print OUT2 ">",$line[0],"\n";
    splice @line,0,1;
    #print OUT join ("",@line),"\n";
    #@line = join("",@line);
    #print @line,"\n";
    if ($nl == 0){ #whole length
        my $seq=join("",@line);
        my @amac = split(//,$seq);
        splice @amac,0,1; # delete first "MM"
        #push @{$s{$key}},@amac;
        print OUT2 @amac,"\n";
        }
        else { # extract inital aa by number ##Guanhua
        my $seq=join("",@line);
        #print $seq,"\n";
        my @amac = split(//,$seq);
        splice @amac,0,1; # delete first "MM"
        splice @amac,$nl; ##delete from the N to end
        #print @amac,"\n";
            #push (@{$s{$key}}, @amac);
        print OUT2 @amac,"\n";
        }

    }

##### PART II

print "nucl or prot?\n";
chomp(my $tp = <STDIN>);

system ("makeblastdb -in $ARGV[1] -dbtype prot");
system ("makeblastdb -in $ARGV[3] -dbtype $tp");

print "blast type? (blastp,blastn)\n";

chomp(my $cmd = <STDIN>);

system ("blastp -query $ARGV[1] -db $ARGV[3] -outfmt 6 -evalue 1e-3 -out 12.out ");
system ("$cmd -db $ARGV[1] -query $ARGV[3] -outfmt 6 -evalue 1e-3 -out 21.out ");
4

1 に答える 1

2

次の行で '$/' を設定すると、perl が 'STDIN' から読み取る方法が変更されました。

local $/ = ">";

これを修正する最も簡単な方法は、その行の直前に左ブラケットを追加し、'##### PART II' コメントの直前に右ブラケットを追加することです。

{
    local $/ = ">";
    ...
    ...
}

##### PART II

(理論的には、入力したテキストの最後に「>」を入れることもできると思いますが、それは奇妙に思えるので、私はしません)

それはあなたの問題を解決します。しかし、対処すべきことは、あなたが行ったスタイルの選択の一部です. 真ん中にある 2 つの大きなコードの塊は、私が知る限り、どちらも同一であり、おそらくサブルーチンに入れてから 2 回呼び出す必要があります。これにより、重複がなくなり、エラーが発生しにくくなります。

ファイルを開くには、3 つの引数の open 呼び出しも使用する必要があります。

于 2014-01-05T06:05:03.713 に答える