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