Как создать хеш массива в Perl - PullRequest
1 голос
/ 20 августа 2011

У меня есть такие данные

Group AT1G01040-TAIR-G
        LOC_Os03g02970 69%
Group AT1G01050-TAIR-G
        LOC_Os10g26600 85%
        LOC_Os10g26633 35%
Group AT1G01090-TAIR-G
        LOC_Os04g02900 74%

Как создать структуру данных, которая выглядит следующим образом:

print Dumper \%big;

$VAR = { "Group AT1G01040-TAIR-G" => ['LOC_Os03g02970 69%'],
         "Group AT1G01050-TAIR-G" => ['LOC_Os10g26600 85%','LOC_Os10g26633 35%'],
         "Group AT1G01090-TAIR-G" => ['LOC_Os04g02900 74%']};

Это моя попытка, но неудача:

my %big;
while ( <> ) {
    chomp;
    my $line = $_;
    my $head = "";
    my @temp;

    if ( $line =~ /^Group/ ) {
        $head = $line;
        $head =~ s/[\r\s]+//g;
        @temp = ();


    }
    elsif ($line =~ /^\t/){
        my $cont = $line;
           $cont =~ s/[\t\r]+//g;
        push @temp, $cont;

        push @{$big{$head}},@temp;
    };

}

Ответы [ 3 ]

2 голосов
/ 20 августа 2011

Вот как бы я это сделал:

my %big;
my $currentGroup;

while (my $line = <> ) {
    chomp $line;

    if ( $line =~ /^Group/ ) {
        $big{$line} = $currentGroup = [];
    }
    elsif ($line =~ s/^\t+//) {
        push @$currentGroup, $line;
    }
}

Возможно, вам следует добавить к этому дополнительную проверку ошибок, например, предложение else для предупреждения о строках, которые не соответствуют ни одному из регулярных выражений. Кроме того, перед нажатием проверьте, если $currentGroup равно undef (в случае, если первая строка начинается с вкладки вместо «Группа»).

Самая большая проблема с вашим исходным кодом заключается в том, что вы объявляете и инициализируете $head и @temp внутри цикла, что означает, что они сбрасываются в каждой строке. Переменные, которые должны сохраняться между строками, должны быть объявлены вне цикла, как я сделал с $currentGroup.

Я не совсем уверен, чего вы собираетесь достичь с помощью бита s/[\r\s]+//g;. \r включен в \s, что означает то же самое, что и s/\s+//g; (который удалит все пробелы), но желаемый хэш результата включает пробелы в ваших ключах. Если вы хотите убрать конечные пробелы, вам нужно включить якорь: s/\s+\z//.

2 голосов
/ 20 августа 2011

Ну, я не хочу давать вам ответ, поэтому я просто скажу вам посмотреть:

Ну что ж, поехали: -).

1 голос
/ 20 августа 2011

Ваши толкающие массивы к вашему хеш-элементу.Вы должны просто подталкивать значения.(Вам вообще не нужно @temp.)

push @{$big{$head}}, $cont;

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

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