Perl,使用regex高效地清理文件时出现问题

Perl,使用regex高效地清理文件时出现问题,regex,arrays,perl,Regex,Arrays,Perl,首先,我将解释我的程序试图解决的问题。我有两个输入文件,其中一个包含“好”数字行: 另一个文件是一个包含“原始”数字的文件,我想检查每一行,看看这一行是否包含上面的“好”数字中的一个,然后是另外4个数字,另外4个数字可以是任何数字。因此,如果包含原始编号的文件为: 8881000001234 1000014321 999991000021234567 00234100001 1000041234 100002123 1000029876 使用正则表达式擦洗后,匹配的数字将 1000001234

首先,我将解释我的程序试图解决的问题。我有两个输入文件,其中一个包含“好”数字行:

另一个文件是一个包含“原始”数字的文件,我想检查每一行,看看这一行是否包含上面的“好”数字中的一个,然后是另外4个数字,另外4个数字可以是任何数字。因此,如果包含原始编号的文件为:

8881000001234
1000014321
999991000021234567
00234100001
1000041234
100002123
1000029876
使用正则表达式擦洗后,匹配的数字将

1000001234
1000014321
1000021234
1000041234
1000029876
到目前为止,我这样做的方式是将“好”数字存储在数组中,然后将“原始”数字转换为标量

my $FH
my@good_nums
open $FH, '<', 'good_numbers' or die $!;
while(<$FH>) { chomp; push @good_nums, $_; }
close $FH;

open $FH, '<', 'raw_numbers' or die $!;
my $raw_nums = do { local $/; <$FH> };
close $FH;
因此,
@matches
包含了正确的匹配项,而且效果良好

但现在我已经开发出了从不匹配的“原始”数字中捕捉线条的需求。我可以通过将“原始”数字放入一个数组(而不是咕噜咕噜)并
@good\u nums
数组加入正则表达式来捕获不匹配的行:

my $QRnums = '(?:' . (join '|', @good_nums) . ')';
$QRnums = qr/$QRnums/;

my @raw_nums;
open my $FH, '<', 'raw_numbers' or die $!;
while(<$FH>) { chomp; push @raw_nums, $_; }

my @matches;
my @junk;
for (@raw_nums) {   
    if ($_ =~ /($QRnums\d{4})/g) {
        push @matches, $1;
    } else {
        push @junk, $_;
    }
}
my$QRnums=”(?:”(加入“|”、@good_nums)。”;
$QRnums=qr/$QRnums/;
我的@raw_nums;

打开我的$FH,“只缓存您的正则表达式一次,然后使用
$进行比较

此外,不需要对另一个文件进行修改,只需逐行处理即可

my $QRnums = '(?:' . (join '|', @good_nums) . ')';
$QRnums = qr/($QRnums\d{4})/;

my @matches;
my @junk;

open my $FH, '<', 'raw_numbers' or die $!;
while (<$FH>) {
    chomp;
    if ($_ =~ $QRnums) {
        push @matches, $1;
    } else {
        push @junk, $_;
    }
}
my$QRnums=”(?:”(加入“|”、@good_nums)。”;
$QRnums=qr/($QRnums\d{4})/;
我的@matches;
我的垃圾;

打开我的$FH,'谢谢这是一个很大的帮助,比我所做的更有效率,如果你能向我解释缓存是如何与regex一起工作的,以及我的示例是如何处理缓存的,这将对我有很大的帮助。如果题目太宽泛,你能给我指一些好的参考资料吗?再次感谢。添加了有关缓存正则表达式的文档链接。
my $QRnums = '(?:' . (join '|', @good_nums) . ')';
$QRnums = qr/$QRnums/;

my @raw_nums;
open my $FH, '<', 'raw_numbers' or die $!;
while(<$FH>) { chomp; push @raw_nums, $_; }

my @matches;
my @junk;
for (@raw_nums) {   
    if ($_ =~ /($QRnums\d{4})/g) {
        push @matches, $1;
    } else {
        push @junk, $_;
    }
}
my $QRnums = '(?:' . (join '|', @good_nums) . ')';
$QRnums = qr/($QRnums\d{4})/;

my @matches;
my @junk;

open my $FH, '<', 'raw_numbers' or die $!;
while (<$FH>) {
    chomp;
    if ($_ =~ $QRnums) {
        push @matches, $1;
    } else {
        push @junk, $_;
    }
}