0

我有一个 .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 文件中填充它的。现在卡在这个问题上了......

4

3 回答 3

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混合。您可以通过这种方式打印出整个数据结构,这也可以帮助您显示逻辑缺陷。

于 2013-08-16T15:03:48.653 回答
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]";
于 2013-08-16T13:21:01.813 回答
1

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

2)打印“$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},";
于 2013-08-16T13:19:39.823 回答