Вот как бы я это сделал:
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//
.