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 番目だけでなく、ファイルの 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

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) print "$dca{$posPair},"; print "$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 に答える