从perl中的数组中查找与特定关键字匹配的记录

时间:2011-08-02 18:33:42

标签: arrays perl

我在程序代码中遇到问题,因为我已将文件更改为数组但不确定是否已更改。因此,请检查下面给出的代码,它显示在最后一行使用未初始化的@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 个答案:

答案 0 :(得分:1)

#!/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";
        }
    }
}