Perl: Могу ли я получить доступ к двум различным уровням массива хэшей одновременно, используя индексы? - PullRequest
0 голосов
/ 27 декабря 2010

Я совершенно новичок в Perl, и мне нужно написать программу, в которой найденные кластеры совпадают, если они находятся на определенном расстоянии друг от друга.Итак, я получил массив хешей, содержащий на каждом уровне начальную позицию, конечную позицию и количество совпадений, присутствующих в кластере (1 в начале).

Если я хочу знать, если расстояние между двумясовпадения в порядке, я делаю Begin2-End1

my $DEBUG = 1;
my @hitsarray =();
my ($beginarray,$endarray,$aantalarray);
my $hit = { BEGIN => $beginarray,   EIND => $endarray,   MATCHES => $aantalarray, };
for (my $k = 0;$k <= $#beginarray;$k++)
{    
    print $beginarray[$k],"\t",$endarray[$k],"\t",$aantalarray[$k],"\n" if ($DEBUG);
    $hit = ();
    $hit->{BEGIN} = $beginarray[$k];
    $hit->{END} = $endarray[$k];
    $hit->{MATCHES} = $aantalarray[$k];
    push (@hitsarray,$hit);
}
for ( my $m = 0; $m <= $#hitsarray; $m++)
{        
    while($hitsarray[$m+1]{BEGIN} - $hitsarray[$m]{END} < 5 && $hitsarray[$m+1]{BEGIN} - $hitsarray[$m]{END} > 3)
    {
        $hitsarray[$m]{END} = $hitsarray[$m+1]{EIND};
        $hitsarray[$m]{MATCHES} +=1;
        delete $hitsarray[$m+1];
        print $beginarray[$m],"\t",$endarray[$m],"\t",$aantalarray[$m],"\n" if ($DEBUG);
    }
}

Но это не работает!Мой компьютер зацикливается и заявляет: «Использование неинициализированного значения в вычитании (-) в строке сценария 55».

Вероятно, что-то связано с использованием ссылок, но я их не совсем понимаю.также пробовал более простую структуру с двумя несвязанными массивами, но у меня та же проблема;

Как вы используете элементы из разных строк (и из разных массивов) длявычитание?

Любая помощь приветствуется !!

Ответы [ 2 ]

6 голосов
/ 27 декабря 2010

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

  1. поместите use warnings; use strict; в начало вашего скрипта.
  2. $ beginarray, $ endarray и $ aantalarray являются скалярами, а не массивами. Возможно, вы захотите, чтобы они были ссылками на массивы, но это не так, потому что вы никогда не назначаете их. ПРИМЕЧАНИЕ: когда вы делаете $beginarray[$m], который ссылается на переменную массива @beginarray, которая является тем же именем, но на самом деле отличается от переменной $ beginarray, которая является скаляром.
  3. Вы не показываете нам все, если у вас возникли проблемы в линии 55
  4. this, $hit = (); на самом деле просто устанавливает SCALAR переменную $ hit на 0, потому что это длина массива ().
  5. $ # beginarray будет -1, потому что @beginarray не объявлен. Даже если вы изменили свой код, чтобы объявить его, в нем по-прежнему нет данных, поэтому первый просмотр не будет выполняться.
  6. delete $hitsarray[$m+1] удалит это значение из массива, но этот индекс будет просто пустым, элементы над ним не будут перемещаться в массиве. Чтобы удалить элемент из массива, вам нужно либо добавить grep в новый массив, либо объединить существующий массив.

Вам нужно сделать гораздо меньший пример или поработать с массивами, чтобы выяснить, что вы делаете неправильно.

0 голосов
/ 28 декабря 2010
for ( my $m = 0; $m <= $#hitsarray; $m++)
{        
    while($hitsarray[$m+1]{BEGIN} - $hitsarray[$m]{END} < 5 && $hitsarray[$m+1]{BEGIN} - $hitsarray[$m]{END} > 3)

Здесь вы используете элемент $ m + 1, который находится за концом массива в финале для итерации.Возможно, ваш цикл должен сказать $m < $#hitsarray.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...