2013-08-16 100 views
0

我有我编辑有点特等文件,但是当我尝试运行它,我得到这个错误哈希表初始化

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哈希表。 您需要文件的所有四列,而不仅仅是第一,第三和第四列,因此 不会执行剪切。

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:它不工作的方式?你能告诉我们一些输入的例子吗? '@ pairs'从哪里来? – Toto

+0

所有输入来自不同文件夹中的不同文件。有createwindow.sh它调用createwindow.pl并且有多个文件。 – user2689506

3

错误消息非常明确:您正在尝试共享为未定义的哈希键值创建一个值,然后尝试打印它。

首先,我认为你有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,这很好。另外,当你想删除语句时,它会给你一些东西来搜索。我喜欢'说',因为我不需要在最后加入'\ n'。我可以复制这一行,并添加'say qq(DEBUG:...);'在该行的附近。事实上,我甚至把它作为一个VIM宏。我想如果我走了那么远,我可以在最后使用warn和'\ n'。 –

+0

'warn'输出警告出现在最后的行号,然后是换行符。警告“某事\ n”会在某种程度上击败目标,因为它不打印行号。 –