2013-08-08 2 views
0

У меня есть небольшая программа, которая в основном обрабатывает списки ударов взрыва и проверяет, есть ли совпадение между результатами взрыва, итерируя результаты взрыва (как хеш-ключ) через хеши, содержащие каждый список взрывов.подпрограмма в perl для выполнения записей #ARGV

Это включает обработку каждого входного файла взрыва как $ ARGV таким же образом. В зависимости от того, чего я пытаюсь достичь, мне может потребоваться сравнить 2, 3 или 4 списков взрыва для перекрытия генов. Я хочу знать, как я могу написать базовый блок обработки в качестве подпрограммы, которую я могу повторить для любых аргументов ARGV.

Например, ниже отлично работает, если I входа 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; 

UPDATE:

Я удалил хэш часть для последний фрагмент.

Полученная структура данных должна быть:

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 
+1

Так в чем проблема? вы попробовали свою версию 'sub'? –

ответ

1

Вы не можете вводить значение переменной в середине имя переменной.

Эти имена не являются действительными (Ну, you can but you shouldn't Даже тогда вы и не можете использовать индексацию массива в середине имени..):

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

Вам нужно переместить индекс к концу :

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

Это говорит о том, что я полностью избавился бы от массивов и вместо этого использовал хэш.

Ваш второй фрагмент кода не показывает вызов вашей подпрограммы. Если это явно не указано, он никогда не будет запущен, и ваша программа ничего не сделает. Я бы изменил 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.

+0

Спасибо - я не думаю, что объяснил, что хочу делать особенно хорошо: см. Обновление. – fugu

+0

Точка, занятая вводом имен переменных в переменные. Основная цель, которую я пыталась достичь, заключалась в том, чтобы создавать хэши с разными именами (% data1,% data2, $ data3), чтобы я мог позже перебирать их. – fugu

+1

@Nick: Когда вы обнаруживаете, что задаете свои имена переменных, строка '% data1 ','% data2', ... вы должны, вероятно, использовать массив (или хэш). –

Смежные вопросы