Не может получить доступ к хэшу значений массива

Я написал следующий код на Perl. Код читает файл pdb и получает некоторые значения. Не обращайте внимания на верхнюю часть кода, где все работает идеально. Проблема в подпрограмме, где я пытаюсь сохранить массивы в hash3 с моделью в качестве ключа, другой ключевой позиции, к значениям массива можно обратиться в условии if, используя это:

$ Hash3{$ модель}{$} координаты [1].

но когда я выхожу из цикла foreach и пытаюсь получить доступ к элементам, я получаю только одно значение. Пожалуйста, посмотрите на конец цикла foreach и скажите, что это неправильный способ доступа к значениям хеша.

Файл pdb, который я использую, можно скачать по этой ссылке http://www.rcsb.org/pdb/download/downloadFile.do?fileFormat=pdb&compression=NO&structureId=1NZS

#!/usr/bin/perl
open(IN,$ARGV[0]);

my @phosphosites;
my $model=1;
my %hash3;
while(<IN>)
  {
    #findmod(@line);
    #finddist;
    #findfreq;
    if((/^MODRES/) && (/PHOSPHO/))
      {
        @line=split;
        push(@phosphosites, $line[2]);
        #print "$line[4]";
      }
    foreach $elements (@phosphosites){
      if(/^HETATM\s+\d+\s+CA\s+$i/)
        {
          @line1=split;
          #print "$line1[5]";
          #print "$line1[6] $line1[7] $line1[8]\n";
          push(@phosphositesnum, $line1[5]);
        }
    }
    $pos=$line1[5];
    #findspatial(\@line,\@line1);
  }

my @ori_data=removeDuplicates(@phosphositesnum);
sub removeDuplicates {
  my %seen = ();
  my @vals = ();

  foreach my $i (@_) {
    unless ($seen{$i}) {
      push @vals, $i;
      $seen{$i} = 1;
    }
  }

  return @vals;
}

$a=(@phosphosites);
print "$a\n";
print "@phosphosites\n";
print "@ori_data\n";

close(IN);

open(IN1,$ARGV[0]);
my (@data)=<IN1>;
spatial(\@ori_data);
sub spatial {

  my @spatial_array1=@{$_[0]};

  foreach $coordinates(@spatial_array1)
    {
      $model=1;
      {foreach $data1(@data){



        if($data1=~ m/^HETATM\s+\d+\s+CA\s+[A-Z]*\s+[A-Z]*\s+$coordinates/)
          {
            @cordivals=split(/\s+/,$data1);
            push @{ $sphash{$model} },[$cordivals[6], $cordivals[7], $cordivals[8]];
            $hash3{$model}{$coordinates}= \@cordivals;
            #print "$model $coordinates $hash3{$model}{$coordinates}[6] $hash3{$model}{$coordinates}[7] $hash3{$model}{$coordinates}[8]\n";
            #print "$model $sphash{$model}[$i][0] $sphash{$model}[$i][1] $sphash{$model}[$i][2]\n";

          }

        elsif($data1=~ m/^ENDMDL/)
          {
            $model++;
          }
        #print "$model $coordinates $hash3{$model}{$coordinates}[6] $hash3{$model}{$coordinates}[7] $hash3{$model}{$coordinates}[8]\n";


      }
     }
    }

    #foreach $z1 (sort keys %hash3)
    #  {
    #    foreach $z2(@spatial_array1){
    #      print "$z1 $z2";
    #      print "$hash3{$z1}{$z2}[6]\n";
    #      print "$z2\n";
    #    }
    #  }
}

После использования опции Data::Dumper это дает мне такой вывод

$VAR1 = {
      '11' => {
                '334' => [
                           'HETATM',
                           '115',
                           'CA',
                           'SEP',
                           'A',
                           '343',
                           '-0.201',
                           '-2.884',
                           '1.022',
                           '1.00',
                           '99.99',
                           'C'
                         ],

                '342' => $VAR1->{'11'}{'334'},

                '338' => $VAR1->{'11'}{'334'},

                '335' => $VAR1->{'11'}{'334'},
                '340' => $VAR1->{'11'}{'334'},

                '343' => $VAR1->{'11'}{'334'},

                '336' => $VAR1->{'11'}{'334'}
              },

      '7' => {

               '334' => $VAR1->{'11'}{'334'},

               '342' => $VAR1->{'11'}{'334'},

               '338' => $VAR1->{'11'}{'334'},

               '335' => $VAR1->{'11'}{'334'},

               '340' => $VAR1->{'11'}{'334'},

               '343' => $VAR1->{'11'}{'334'},

               '336' => $VAR1->{'11'}{'334'}

             },

      '2' => {

               '334' => $VAR1->{'11'}{'334'},

               '342' => $VAR1->{'11'}{'334'},
               ...

1 ответ

Решение

Изменить:

@cordivals=split(/\s+/,$data1);

чтобы:

my @cordivals=split(/\s+/,$data1);

Кажется, что происходит, что все хеш-элементы содержат ссылки на одну и ту же переменную массива, потому что вы не делаете переменную локальной для этой итерации.

В общем, вы должны использовать my со всеми переменными.

Другие вопросы по тегам