2013-08-16 97 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」會在某種程度上擊敗目標,因爲它不打印行號。 –