Вопрос по hash, add, perl, arrays, while-loop – Perl, хэш массивов: добавление и удаление ключей, добавление в массив, все в цикле while

3

У меня есть хеш, который должен содержать определенные ключи, которые связаны с их собственными массивами. Чтобы быть более точным, ключи хэша - это значения качества, а массивы - имена последовательностей. Если уже есть массив для этого качества, яЯ хочу добавить имя последовательности в массив, который связан с рассматриваемым качеством. Если нетt один, я хочу создать один и добавить к нему имя последовательности. Все это делается в цикле while, просматривая все последовательности одну за другой.

мы пытались делать такие вещи, как вPerl Как мне получить массив из хэша массивов? Но я могу'Кажется, это не так.

Я просто получаю эти сообщения об ошибках: Скалярное значение @ {hash {$ q} лучше записать как $ {hash {$ q} в строке 69 asdasd.pl. Глобальный символ "@q» требует явного имени пакета asdasd.pl строка 58. И некоторые другие тоже.

Вот пример того, что ямы пробовали:

my %hash;
while (reading the sequences) {
    my $q = "the value the sequence has";
    my $seq = "the name of the sequence";

    if (exists $hash{$q}) {
        push (@{$hash{$q}}, $seq);
    } else {
        $hash{$q} = \@q;
        $hash{$q} = [$seq];
        next;
    }
}

Это явно не должноэто очень сложная проблема, но яЯ новичок в Perl, и такая проблема кажется сложной. Я'Я гуглил это из разных мест, но, кажется, есть кое-что, чего я просто неЯ не понимаю, и это тоже может быть очевидно.

Хм, да, этонигде не определены, это может вызвать проблемы. Я'Я все еще не понимаю, как можно (и иногда нужно) переключаться с from или @ в $ в разных ситуациях, без необходимости что-либо определять, иногда я получаю ошибки, а иногда я 'Я хотел это сделать. Во всяком случае, я получил это работать с подсказкой, которая мне действительно нужна только "От себя" заявление. Vamii
Ответ, который я принял, был решением. Я неУ меня больше нет кода, связанного с этой проблемой. :) Vamii
Пожалуйста, отправьте рабочий код. В противном случае очень сложно ответить на ваши вопросы. shawnhcorey
там'довольно простое объяснение% против@ против$ вperldoc.perl.org/perldata.html#Variable-names , код у вас должен был быть в порядке, за исключением ненужной строки, которая использовала@q; не уверен, что это пытался сделать. ysth
Массив@q не определено. Пожалуйста, включите его в свой код. shawnhcorey

Ваш Ответ

2   ответа
2

В вашемelse заблокировать ссылку@q в ваш хэш, то сразу же перезаписать его[$seq]будет выполняться только последняя операция с хешем

Ты нене нужноnext в конце вашего цикла он автоматически перейдет к следующей итерации, если в теле цикла больше нет операторов для выполнения.

Все остальное работает нормально, вот мои ревизии и данные испытаний, которые я использовал (так как я неничего не знаю о последовательностях ДНК, я просто использовал буквы, которые я помню из биологии средней школы)

Входной файл:

A 1
T 2
G 3 
A 3
A 2
G 5
C 1
C 1
C 2
T 4

Код:

use strict;
use warnings FATAL => 'all';

# open file for reading
open(my $fh, '<', 'test.txt');

my %hash;
while ( my $line = <$fh> ) { # read a line

    # split the line read from a file into a sequence name and value
    my ($q, $seq) = split(/\s+/, $line);

    if( exists $hash{$q} ) {
        push @{ $hash{$q} }, $seq;
    } 
    else {
        $hash{$q} = [$seq];
    }
}

# print the resulting hash
for my $k ( keys %hash ) {
   print "$k : ", join(', ', @{$hash{$k}}), "\n";
}


# prints
# A : 1, 3, 2
# T : 2, 4
# C : 1, 1, 2
# G : 3, 5
4

что вызывает Perlautovivification сделать это довольно легко. Ваш код неМне нужно это центральное if-утверждение. Вы можете свести это к:

    push @{ $hash{$q} }, $seq;

Если конкретный ключ неtl еще не существует в хэше, perl автоматически его активирует, так как он может заключить, что вам нужна ссылка на массив.

Вы можете найти дополнительные ресурсы по автовивификации, прибегнув к помощи Google. Это'Это достаточно уникальное слово, что подавляющее большинство хитов кажется актуальным. :-)

Ох, как волшебство: так просто, и все же оно делает именно то, что я хочу. Спасибо! Vamii

Похожие вопросы