Разделитель относительной записи в Perl - PullRequest
3 голосов
/ 31 января 2012

У меня есть данные, которые выглядят так:

id:40108689 --
chr22_scrambled_bysegments:10762459:F : chr22:17852459:F (1.0),
id:40108116 --
chr22_scrambled_bysegments:25375481:F : chr22_scrambled_bysegments:25375481:F (1.0),
chr22_scrambled_bysegments:25375481:F : chr22:19380919:F (1.0),
id:1 --
chr22:21133765:F : chr22:21133765:F (0.0),

Таким образом, каждая запись отделяется id:[somenumber] --

Как получить доступ к данным, чтобы у нас был хэш массива:

$VAR = { 'id:40108689' => [' chr22_scrambled_bysegments:10762459:F : chr22:17852459:F (1.0),'], 

         'id:40108116' => ['chr22_scrambled_bysegments:25375481:F :chr22_scrambled_bysegments:25375481:F (1.0)',
'chr22_scrambled_bysegments:25375481:F : chr22:19380919:F (1.0),'
         #...etc
       }

Я попытался приблизиться к этому, используя разделитель записей. Но не уверен, как это обобщить?

{
    local $/ = " --\n";  # How to include variable content id:[number] ?

    while ($content = <INFILE>) {
      chomp $content;
      print "$content\n" if $content; # Skip empty records
    }
}

1 Ответ

6 голосов
/ 31 января 2012
my $result = {};
my $last_id;
while (my $line = <INFILE>) {
    if ($line =~ /(id:\d+) --/) {
        $last_id = $1;
        next;
    }
    next unless $last_id; # Just in case the file doesn't start with an id line

    push @{ $result->{$last_id} }, $line;
} 

use Data::Dumper;
print Dumper $result;

Использует обычный разделитель записей.

Использует $ last_id для отслеживания последней встреченной строки идентификатора и устанавливается на следующий идентификатор, когда встречается другой.Выдвигает строки без идентификатора в массив для ключа хэша последней совпадающей строки идентификатора.

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