Вот некоторый очищенный код, который будет делать то же самое, что и код, который вы опубликовали, за исключением того, что он не печатает $hhfile[10]
вместе с каждым шаблоном рекламы перед их тестированием; если вам нужен этот вывод, то вам придется пройтись по всем шаблонам и протестировать каждый из них в основном так же, как вы уже это делали. (Хотя даже в этом случае было бы лучше, если бы ваши циклы были for my $count (0 .. $lines)
вместо стиля C * for (...;...;...)
.)
Вместо того, чтобы тестировать каждый шаблон отдельно, я использовал Regexp :: Assemble , который создаст один шаблон, что эквивалентно тестированию всех отдельных подстрок одновременно. Оператор умного совпадения (~~
) в ответе Нихила Джайна будет использовать в основном то же самое при использовании, как показано в его ответе, но для этого потребуется Perl 5.10 или более поздняя версия, в то время как Regexp :: Assemble все равно будет работать для вас, если вы используете 5.8 или (не дай бог!) 5.6.
#!/usr/bin/env perl
use warnings;
use strict;
use Regexp::Assemble;
die "usage: $0 inputfilename\n" unless @ARGV == 1;
my $inputfile = $ARGV[0];
my $outputfile = $inputfile . '.ads';
my $ad_file = "C:/test/easylist.txt";
my @ad_list;
# Create a list of substrings in the easylist.txt file
open my $ads_fh, '<', $ad_file or die "can't open $ad_file: $!";
while (<$ads_fh>) {
chomp;
push @ad_list, $_;
}
for (@ad_list) {
print "$_\n"; # Or just "print;" - the $_ will be assumed
}
my $ra = Regexp::Assemble->new;
$ra->add(@ad_list);
open my $in_fh, '<', $inputfile or die "can't open $inputfile: $!";
while (<$in_fh>) {
my @hhfile = split /,/;
print "TRUE !\n" if $ra->match($hhfile[9]);
}
(Код синтаксически действителен, согласно perl -c
, но после этого не тестировался.)