поиск записей, соответствующих конкретному ключевому слову из массива в perl - PullRequest
0 голосов
/ 02 августа 2011

У меня проблема с кодом программы, поскольку я изменил свой файл в массив, но не уверен, был ли он изменен или нет. Поэтому, пожалуйста, проверьте приведенный ниже код, также он показывает ошибку использования неинициализированной @data в последней строке.

Теперь после этого моя самая большая проблема заключается в том, что я хочу собирать только те элементы в массиве, между которыми есть определенное ключевое слово. Например, каждый элемент массива начинается там, где заканчивается women и начинается children. Эти слова являются общими во всех других элементах, но информация между ними различна, и я хочу, чтобы только те элементы, которые имеют ключевое слово «фактор человек» где-то посередине, поэтому я хочу извлечь не все, а только те элементы, которые имеют ключевое слово «фактор» человек'.

Как вы видите, мой файл содержит все начальные слова, общие для всех элементов, но после этого информация отличается, но каждый элемент начинается с women и заканчивается на children. Пожалуйста, кто-нибудь может направить меня по этому вопросу. Спасибо заранее.

Входной файл

women bds1
origin USA
accession not known
factor xyz
work abc
children
women sds2
origin ENG
accession known
factor man
work wwe
children
women cfc4
origin UK
factor xxx
work efg
children
women gtg6
origin UAE
factor man
work qqq
children

Сценарий

#!/usr/bin/env perl
use strict;
use warnings;

my $ifh;
my $line = '';
my @data;

my $ifn  = "fac.txt";

open ($ifh, "<$ifn") || die "can't open $ifn";
my $a = "women  ";
my $b = "children ";
my $_ = " ";
while ($line = <$ifh>)
{
chomp 
   if ($line =~ m/$a/g); {
     $line = $_;

   push @data, $line;

while ($line = <$ifh>) 
{
    $line .= $_;

push @data, $line;

last if 
($line =~ m/$b/g);
}

}

push @data, $line; }


print @data;

выход

women  sds2
origin  ENG
accession known
factor  man
work  wwe
children
women  gtg6
origin  UAE
factor  man
work  qqq
children

1 Ответ

1 голос
/ 03 августа 2011
#!/usr/bin/perl
use strict;
use warnings;

my @AoH;#Array of hashes
my $ifn  = 'fac.txt';

open my $fh, '<', $ifn or die "Failed to open $ifn: $!";

my $i = 0;
while(<$fh>){
    chomp;
    my @flds = split;
    $AoH[$i]{$flds[0]}{content} = $flds[1];
    $AoH[$i]{$flds[0]}{seqnum} = $.;
    $i++ if $flds[0] eq 'children';
}

foreach my $href (@AoH){
    if (${$href}{factor}{content} eq 'man'){
        foreach my $k (sort {${$href}{$a}{seqnum}
                        <=> ${$href}{$b}{seqnum}} keys %$href){
            my $v;
            if (defined ${$href}{$k}{content}){
                $v = ${$href}{$k}{content};
            }
            else{
                $v = ' ';#Space if undefined
            }
            print "$k $v\n";
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...