哈希表初始化

时间:2013-08-16 13:14:58

标签: perl shell

我有一个.pl文件,我编辑了一下,但当我尝试运行它时,我收到此错误

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 $num=@seq;
        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文件中填充上面几行代码。 现在坚持这个为年龄.....

3 个答案:

答案 0 :(得分: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命令。这就像print语句,但它最后会自动换行。它使得添加调试语句变得更加容易。您只需复制所需的行,并在整行中添加say qq(DEBUG: ... );。然后,您可以在可能不想插入的变量名称前加上反斜杠。

最后一步是使用Data::Dumper进行混音。您可以通过这种方式打印出整个数据结构,这也有助于向您展示逻辑缺陷。

答案 1 :(得分:1)

1)你正在定义我的@dca和我的%dca。最好避免重复同名...

2)打印“$ dca {$ posPair},”;更改为打印“$ dca-&gt; {$ 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},";

答案 2 :(得分: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]";