我有一个数组@arr1
,其中每个元素的格式为#define A B
。
我有另一个文件f1
,内容为:
#define,x,y
#define,p,q
等等。我需要检查每一行(y
,q
等)的第二个值是否与数组的任何元素中的第一个值匹配。示例:假设数组具有元素#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;
}
}
这只是挂起。毫无疑问,我在我面前丢失了一些东西,但是什么?
答案 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;
这意味着您正在修改要迭代的数组。这不仅仅是不好的做法,这也意味着你最有可能因为它而无限循环。