Поскольку вам нужны прямые фрагменты данных из каждого раздела, а разделы и данные четко разграничены, вопрос заключается в том, какую структуру данных использовать. Учитывая, что вам нужны простые строки со значениями, собранными из каждого раздела, простой массив должен подойти.
Известно, что интересующие фразы, Query:
, затем Degardome Category: N
, затем p-value
, являются уникальными для контекста и мест, показанных в примере.
use warnings;
use strict;
use feature 'say';
my $file = shift || die "Usage $0 file\n";
open my $fh, '<', $file or die "Can't open $file: $!";
my (@res, @query, $category, $pvalue);
while (<$fh>) {
next if not /\S/;
if (/(.*?)\s+Query:\s+(.*)/) {
@query = ($1, $2);
next;
}
if (/^\s*(Degardome Category:\s+[0-9]+)/) {
$category = $1;
}
elsif (/^\s*(Degradome p-value:\s+[0-9.]+)/) {
$pvalue = $1;
push @res, [$category, $pvalue, @query];
}
}
say "@$_" for @res;
Конец секции обнаруживается линией p-value:
, после чего мы добавляем к @res
массив ссылок со всеми необходимыми значениями, захваченными до этой точки.
Регулярное выражение везде зависит от свойств данных, видимых в образце. Пожалуйста, просмотрите и исправьте, если некоторые из моих предположений не верны.
Подробности также могут быть получены из данных более точно, даже путем простого добавления групп захвата к приведенным выше регулярным выражениям (и сохранения этих захватов в дополнительные структуры данных).