2013-08-16 2 views
0

У меня есть .pl файл, который я отредактированный немного, но когда я пытаюсь запустить его я получаю эту ошибкуHash Таблицы инициализация

Use of uninitialized value within %dca in concatenation (.) or string at ./createWindow.pl line 65. 
Use of uninitialized value in concatenation (.) or string at ./createWindow.pl line 64. 
Use of uninitialized value in concatenation (.) or string at ./createWindow.pl line 64. 
Use of uninitialized value within %dca in concatenation (.) or string at ./createWindow.pl line 65. 

Кодекса для следующего

#!/usr/bin/perl -w 

use strict; 

my $window=$ARGV[0]; 
my $windowCentral=$ARGV[1]; 

my $sep=$ARGV[2]; 

my @pairs=`cat $ARGV[3]`; 
chomp @pairs; 

my @pssm=`cat $ARGV[4]`; 
chomp @pssm; 

my @predSS=`cat $ARGV[5] | cut -d, -f1`; 
chomp @predSS; 

my @predSA=`cat $ARGV[6]`; 
chomp @predSA; 

my @predRCH=`cat $ARGV[7]`; 
chomp @predRCH; 

my @predCN=`cat $ARGV[8]`; 
chomp @predCN; 

my @seq=`cat $ARGV[9]`; 
chomp @seq; 

my @prop=`cat ../propensity.txt | cut -d\\ -f1,3`; 
chomp @prop; 
my %prop; 
foreach(@prop) { 
     my @v=split(/ /); 
     $prop{$v[0]}=$v[1]; 
} 
my @dca=`cat $ARGV[10]`; 
chomp @dca; 
my %dca; 
foreach(@dca) { 
     my @v=split(/ /); 
     $dca{"$v[0],$v[1]"}="$v[2],$v[3]"; 
} 

my $count=0; 
foreach my $pair (@pairs) { 
    my @values=split(/,/,$pair); 
    next if($values[2]<$sep); 
    $count++; 
    my $r1=$values[0]-1; 
    my $r2=$values[1]-1; 
    my $central=($r2-$r1)/2; 

    #separation between contactd 
     print "$values[2],"; 
    #propensity 
     my $AApair=$seq[$r1].$seq[$r2]; 
     print "$prop{$AApair},"; 
     #sequence length 
     my [email protected]; 
     print "$num,"; 
    #dca 
     my $posPair="$values[0],$values[1]"; 
     print "$dca{$posPair},"; 


    #PredSS of windows around contact residues 
    &dumpWindow($r1,$window,@predSS); 
    &dumpWindow($r2,$window,@predSS); 

Остального кода работает отлично, но я не могу определить индексацию хэш-таблицы dca. Вам нужны все четыре столбца файла, а не только 1-й, 3-й и 4-й, поэтому не выполняют разрез.

my @dca=`cat $ARGV[10]`; 


> chomp @dca; 
> my %dca; 
> foreach(@dca) { 
>   my @v=split(/ /); 
>   $dca{$v[0]}=$v[1]; 
> } 

Ключ к хэш-таблицы должен быть конкатенация 2 остатков индексов, а значение конкатенация 3 и 4 столбцов:

$dca{"$v[0],$v[1]"}="$v[2],$v[3]"; 
> 
>   my $AApair=$seq[$r1].$seq[$r2]; 
>   print "$dca{$AApair},"; 
> 

Для индекса хэш-таблицу, нужны r1 и r2, а не аминокислоты в этих положениях.

my $posPair="$values[0],$values[1]"; 
print "$dca{$posPair},"; 

индексирование хеш-таблицы dca неправильным способом. Посмотрите, как вы заполняете его из файла .contact несколькими строками кода выше. Застрял в этом для веков теперь .....

ответ

1

1) вы определяете мою @dca и мою% dca. Лучше избегать дублирования одного и того же имени ...

2) print "$ dca {$ posPair},"; изменить на печать "$ dca -> {$ posPair}";

Я бы определил вашу переменную хэша как ссылку на хеш вместо самого хэша. После этого вы можете попробовать указать на свои ключи. Я бы обновил несколько строк в вашем коде. Посмотрите, пожалуйста, на этом примере:

my $dca = {}; 
#then populating dca keys: 
$dca->{"$v[0],$v[1]"}="$v[2],$v[3]"; #please note , char which is missing in later usage. 

#and how to get your values: 
my $posPair=$values[$r1].','.$values[$r2]; #I added missing coma here. 
print "$dca ->{$posPair},"; 
+0

1 2 0,311808 0,199348 1 3 0,310089 0,236611 1 4 0,344717 0,130342 1 5 0,449746 0,0971291 1 6 0,346515 0,194622 1 7 0,310089 0,207573 1 8 0,310452 0,195762 – user2689506

+0

Это принимает входной сигнал из файла, который имеет 4 колонки. собираюсь попробовать ур код сейчас – user2689506

+0

Глобальный символ «$ dca» требует явного имени пакета в ./createWindow.pl строке 43. Глобальный символ «$ dca» требует явного имени пакета в ./createWindow.pl строке 65. Выполнение. /createWindow.pl прервано из-за ошибок компиляции. – user2689506

1

Ваш будут заселять хэш с ключами, как: "$v[0],$v[1]" и вы читаете его с ключами, как $values[$r1].$values[$r2]

изменить строку

$dca{"$v[0],$v[1]"}="$v[2],$v[3]"; 

в

$dca{"$v[0]$v[1]"}="$v[2],$v[3]"; 
+0

Это не сработало ... Thankyou – user2689506

+0

@ user2689506: В каком направлении это не сработало? Не могли бы вы показать нам пример ввода? Откуда берется «@ пар»? – Toto

+0

Все входы из разных файлов в разных папках. Существует createwindow.sh, который вызывает createwindow.pl и есть несколько файлов. – user2689506

3

Сообщение об ошибке достаточно ясно: вы пытаетесь сотрудничать ncatenate значение для неопределенного значения ключа хэша, и вы пытаетесь его распечатать.

Прежде всего, я полагаю, что у вас есть use strict; и use warngings;?

Что вам нужно сделать, это проверить свой код, прежде чем выполнять конкатенацию и печать. Это может быть ошибка, и, возможно, вам захочется распечатать заявление об отладке, чтобы помочь вам найти проблему.

if (not defined $value[$r1] or not defined $values[$r2]) { 
    print "DEBUG: Whoops! I have a problem...\n"; 
    no warnings qw(uninitialized); #DEBUG: 
    say qq(DEBUG: \$posPair = \$value[$r1] . \$values[$r2]); 
    say qq(DEBUG: \$posPair = $value[$r1] . $values[$r2]); 
    use warnings qw(uninitialized); 
else { 
    my $posPair = $values[$r1] . $values[$r2]; 
    print "$dca{$posPair},"; 
} 

no warnings qw(uninitialized) отключит предупреждение, которое вы получаете. Это временно сделано, поэтому я могу видеть свои отладочные заявления. use warnings qw(initialized) снова включает эти предупреждения (это то, что вы хотите).

Это даст вам ключ к тому, что происходит.Каково значение $r1 и $r2 на данный момент? Оба являются неопределенными, или это только один, а не другой?

В коде есть логический недостаток, а распечатка отладочных заявлений - хороший способ быстро найти проблему. У Perl есть отладчик, но я нахожу здесь несколько инструкций, и там можно более быстро определить проблему, чем использовать отладчик.

Если принять этот подход, вам нужно добавить строку с другими use заявления:

use feature qw(say); 

Это даст вам использовать команду say. Это похоже на инструкцию печати, но автоматически создает новую строку в конце. Это упрощает добавление отладочной инструкции. Вы просто дублируете нужную строку и добавляете say qq(DEBUG: ...); по всей строке. Затем вы можете поставить обратную косую черту перед именами переменных, которые вы, возможно, не захотите интерполировать.

Последним шагом является использование Data::Dumper. Вы можете распечатать всю свою структуру данных таким образом, что также может показать вам логические недостатки.

+0

Что облегчает добавление отладки, не использует 'say' вместо' print', но использует 'warn' ... –

+0

@DondiMichaelStroma - Я понимаю, почему' warn' было бы хорошо. Он будет выводиться на STDERR, что приятно. Кроме того, он дает вам возможность искать, когда вы хотите удалить утверждения. Мне нравится 'say', потому что мне не нужно вставлять' \ n' в конец. Я могу дублировать строку и добавить в 'say qq (DEBUG: ...);' вокруг строки. Фактически, у меня даже есть это как макрос VIM. Я думаю, если бы я зашел так далеко, я мог бы использовать предупреждение и '\ n' в конце. –

+0

'warn' печатает номер строки, с которой в конце появляется предупреждение, а затем - новая строка. предупреждать «что-то \ n» несколько раз побеждает цель, поскольку она не печатает номер строки. –

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