我有一个.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文件中填充上面几行代码。 现在坚持这个为年龄.....
答案 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]";