Perl:将文件内容与数组内容进行匹配

时间:2016-01-08 10:23:15

标签: arrays regex perl file-io

我有一个数组@arr1,其中每个元素的格式为#define A B

我有另一个文件f1,内容为:

#define,x,y
#define,p,q

等等。我需要检查每一行(yq等)的第二个值是否与数组的任何元素中的第一个值匹配。示例:假设数组具有元素#define abc 123,并且文件具有行#define,hij,abc

当发生这样的匹配时,我需要将行#define hij 123添加到数组中。

while(<$fhDef>)               #Reading the file
{
    chomp;
    $_ =~ tr/\r//d;
    if(/#define,(\w+),(\w+)/)
    {
        my $newLabel = $1;
        my $oldLabel = $2;
        push @oldLabels, $oldLabel;
        push @newLabels, $newLabel;
    }
}

      foreach my $x(@tempX)             #Reading the array
      {
            chomp $x;
            if($x =~ /#define\h{1}\w+\h*0x(\w+)\h*/)
            {
                my $addr = $1;
                unless(grep { $x =~ /$_/ } @oldLabels) 
                {
                    next;
                }
                my $index = grep { $oldLabels[$_] eq $_ } 0..$#oldLabels;
                my $new1 = $newLabels[$index];
                my $headerLabel1 = $headerLabel."X_".$new1;
                chomp $headerLabel1;
                my $headerLine = "#define ".$headerLabel1."0x".$addr;
                push @tempX, $headerLine;
            }
         }

这只是挂起。毫无疑问,我在我面前丢失了一些东西,但是什么?

2 个答案:

答案 0 :(得分:2)

规范的方法是使用哈希。使用第一个参数作为键来散列数组。然后遍历文件并检查散列中是否存在密钥。我使用HoA(数组哈希)来处理每个键的多个值(参见最后两行)。

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

my @arr1 = ( '#define y x',
             '#define abc 123',
           );

my %hash;
for (@arr1) {
    my ($arg1, $arg2) = (split ' ')[1, 2];
    push @{ $hash{$arg1} }, $arg2;
}

while (<DATA>) {
    chomp;
    my ($arg1, $arg2) = (split /,/)[1, 2];
    if ($hash{$arg2}) {
        print "#define $arg1 $_\n" for @{ $hash{$arg2} };
    }
}

__DATA__
#define,x,y
#define,p,q
#define,hij,abc
#define,klm,abc

答案 1 :(得分:1)

正如另一个答案所说,最好使用散列。另外,请记住,你正在做一个

foreach my $x(@tempX)

但你也在做

push @tempX, $headerLine;

这意味着您正在修改要迭代的数组。这不仅仅是不好的做法,这也意味着你最有可能因为它而无限循环。