0

基本的に爆破ヒットのリストを処理し、各爆破リストを含むハッシュを介して爆破結果を (ハッシュ キーとして) 反復処理することにより、爆破結果間に重複があるかどうかを確認する小さなプログラムを用意しました。

これには、各ブラスト入力ファイルを同じ方法で $ARGV として処理することが含まれます。達成しようとしていることに応じて、遺伝子の重複について 2 つ、3 つ、または 4 つのブラスト リストを比較したいと思うかもしれません。基本的な処理ブロックを、$ARGV 引数がいくつあっても反復できるサブルーチンとして記述する方法を知りたいです。

たとえば、2 つのブラスト リストを入力した場合、以下は正常に機能します。

#!/usr/bin/perl -w
use strict; 
use File::Slurp;
use Data::Dumper;
$Data::Dumper::Sortkeys = 1;

if ($#ARGV != 1){
    die "Usage: intersect.pl <de gene list 1><de gene list 2>\n"
}   

my $input1 = $ARGV[0];
open my $blast1, '<', $input1 or die $!;

my $results1 = 0;
my (@blast1ID, @blast1_info,  @split);
while (<$blast1>) {
    chomp;
    @split = split('\t');
    push @blast1_info, $split[0];
    push @blast1ID, $split[2];
    $results1++;
}   
print "$results1 blast hits in $input1\n";

my %blast1;
push @{$blast1{$blast1ID[$_]} }, [ $blast1_info[$_] ] for 0 .. $#blast1ID;
#print Dumper (\%blast1);

my $input2 = $ARGV[1];
open my $blast2, '<', $input2 or die $!;

my $results2 = 0;
my (@blast2ID, @blast2_info);
while (<$blast2>) {
    chomp;
    @split = split('\t');
    push @blast2_info, $split[0];
    push @blast2ID, $split[2];
    $results2++;
}   

my %blast2;
push @{$blast2{$blast2ID[$_]} }, [ $blast2_info[$_] ] for 0 .. $#blast2ID;
#print Dumper (\%blast2);

print "$results2 blast hits in $input2\n";

しかし、3 つまたは 4 つのブラスト リスト入力に対応できるように調整できるようにしたいと考えています。これには、入力ごとに呼び出されるサブルーチンが最適に機能し、次のようになると思います。

sub process {

my $input$i = $ARGV[$i-1];
open my $blast$i, '<', $input[$i] or die $!;

my $results$i = 0;
my (@blast$iID, @blast$i_info,  @split);
while (<$blast$i>) {
    chomp;
    @split = split('\t');
    push @blast$i_info, $split[0];
    push @blast$iID, $split[2];
    $results$i++;
}   
print "$results$i blast hits in $input$i\n";

print Dumper (\@blast$i_info);
print Dumper (\@blast$iID);

# Call sub 'process for every ARGV...

&process for 0 .. $#ARGV;

アップデート:

最後のスニペットのハッシュ部分を削除しました。

結果のデータ構造は次のようになります。

爆風4発<$input$i>

$VAR1 = [
          'TCONS_00001332(XLOC_000827),_4.60257:9.53943,_Change:1.05146,_p:0.03605,_q:0.998852',
          'TCONS_00001348(XLOC_000833),_0.569771:6.50403,_Change:3.51288,_p:0.0331,_q:0.998852',
          'TCONS_00001355(XLOC_000837),_10.8634:24.3785,_Change:1.16613,_p:0.001,_q:0.998852',
          'TCONS_00002204(XLOC_001374),_0.316322:5.32111,_Change:4.07226,_p:0.00485,_q:0.998852',
];



$VAR1 = [
          'gi|50418055|gb|BC078036.1|_Xenopus_laevis_cDNA_clone_MGC:82763_IMAGE:5156829,_complete_cds',
          'gi|283799550|emb|FN550108.1|_Xenopus_(Silurana)_tropicalis_mRNA_for_alpha-2,3-sialyltransferase_ST3Gal_V_(st3gal5_gene)',
          'gi|147903202|ref|NM_001097651.1|_Xenopus_laevis_forkhead_box_I4,_gene_1_(foxi4.1),_mRNA',
          'gi|2598062|emb|AJ001730.1|_Xenopus_laevis_mRNA_for_Xsox17-alpha_protein',
];

そして入力:

TCONS_00001332(XLOC_000827),_4.60257:9.53943,_Change:1.05146,_p:0.03605,_q:0.998852     0.0     gi|50418055|gb|BC078036.1|_Xenopus_laevis_cDNA_clone_MGC:82763_IMAGE:5156829,_complete_cds
TCONS_00001348(XLOC_000833),_0.569771:6.50403,_Change:3.51288,_p:0.0331,_q:0.998852     0.0     gi|283799550|emb|FN550108.1|_Xenopus_(Silurana)_tropicalis_mRNA_for_alpha-2,3-sialyltransferase_ST3Gal_V_(st3gal5_gene)
TCONS_00001355(XLOC_000837),_10.8634:24.3785,_Change:1.16613,_p:0.001,_q:0.998852       0.0     gi|147903202|ref|NM_001097651.1|_Xenopus_laevis_forkhead_box_I4,_gene_1_(foxi4.1),_mRNA
TCONS_00002204(XLOC_001374),_0.316322:5.32111,_Change:4.07226,_p:0.00485,_q:0.998852    0.0     gi|2598062|emb|AJ001730.1|_Xenopus_laevis_mRNA_for_Xsox17-alpha_protein
4

1 に答える 1

2

変数名の途中に変数値を挿入することはできません。(まあ、できますが、すべきではありません。それでも、名前の途中で配列インデックスを使用することはできません。)

これらの名前は無効です:

@blast[$i]_info
@blast[$i]_ID

インデックスを最後に移動する必要があります。

@blast_info[$i]
@blast_ID[$i]

そうは言っても、配列を完全に取り除き、代わりにハッシュを使用します。

2 番目のコード スニペットは、サブルーチンへの呼び出しを示していません。明示的に呼び出されない限り、実行されることはなく、プログラムは何もしません。サブルーチンを変更してprocess、単一の引数を取り、の各要素に対して呼び出すようにします@ARGV。例えば

process($_) foreach @ARGV;

プログラムの書き方は次のとおりです。

use strict;
use warnings;
use Data::Dumper;

my @blast;
push @blast, process($_) foreach @ARGV;

print Dumper(\@blast);

sub process {
    my $file = shift;

    open my $fh, '<', $file or die "Can't read file '$file' [$!]\n";

    my %data;

    while (<$fh>) {
        chomp;
        my ($id, undef, $info) = split '\t';
        $data{$id} = $info;
    }

    return \%data;
}

結果のデータ構造がどのように見えるかは明確ではありません。(私の最善の推測です。) perlreftutを読んで参照の基本的な理解を深め、それらを使用して Perl でデータ構造を構築することをお勧めします。

于 2013-08-08T13:27:32.390 に答える