Возможно, я неправильно понимаю проблему, но как насчет простого
my %result;
while (<$fh>) {
my ($type, $components) = /(\w+)\s*=\s*"([^"]+)/;
push @{$result{$type}}, split ' ', $components; # all in one arrayref
#push @{$result{$type}}, [ split ' ', $components ]; # or as separate ones
}
Это предполагает наличие нескольких строк с COMPONENTS
и / или PACKAGES
(или любых других ведущих ключевых слов на самом деле) и предполагает, чтоони не связаны друг с другом и поэтому должны храниться отдельно.
Уточните, если предположения неверны.
Приведенный выше код создает хеш
(
COMPONENTS => [ 'A0000', 'B0000', 'G0000', ... ],
PACKAGES => [ ... ],
)
, где [ ... ]
- это ссылка на массив со всеми строками для этого ключевого слова..
Или, если закомментированная строка в коде используется вместо строки над ней,
(
COMPONENTS => [ ['A0000', 'B0000', 'G0000'], [ ... ], ... ],
PACKAGES => [ [ ... ], [ ... ], ... ],
)
, где [ ... ]
- это массивы с компонентами из строки, которыевсе хранится в arrayref, который является значением для ключа.Таким образом, здесь компоненты для каждой строки хранятся отдельно, а не все находятся в одном arrayref, как в предыдущем случае.
Если есть какие-либо другие слова до =
, они сохраняются как свои собственные ключи со своими собственнымиarrayref (s) с данными из этих строк.
Обновление до пояснений
Поскольку кавычки могут быть или не быть, сделайте первый необязательным с ?
/(\w+)\s*=\s*"?[^"]+)/;
, в то время как завершающий не нужно обрабатывать, так как остальные данные должны быть сопоставлены