Menda URL satrlari ro'yxatiga mos kelishim kerak bo'lgan pastki qatorlar ro'yxati bor. Pastki satrlarda '|', '*', '-', '+' va hokazo kabi maxsus belgilar mavjud. Agar URL satrlari o'sha pastki qatorni o'z ichiga olgan bo'lsa, men biroz operatsiya qilishim kerak. Ammo hozircha konsolda "TRUE" ni chop etaman.
Men buni birinchi navbatda pastki qatorlar ro'yxatidan o'qish va uni xeshga qo'yish orqali qildim. Keyin moslik topilmaguncha har bir URL uchun butun ro'yxatning oddiy Regexp mosligini bajarishga harakat qildim. Kod shunga o'xshash narsa.
open my $ADS, '<', $ad_file or die "can't open $ad_file";
while(<$ADS>) {
chomp;
$ads_list_hash{$lines} = $_;
$lines ++;
}
close $ADS;
open my $IN, '<', $inputfile or die "can't open $inputfile";
my $first_line = <$IN>;
while(<$IN>) {
chomp;
my @hhfile = split /,/;
for my $count (0 .. $lines) {
if($hhfile[9] =~ /$ads_list_hash{$count}/) {
print "$hhfile[9]\t$ads_list_hash{$count}\n";
print "TRUE !\n";
last;
}
}
}
close $IN;
Muammo shundaki, pastki satrlarda juda ko'p maxsus belgilar mavjud bo'lib, ular $hhfile[9] =~ /$ads_list_hash{$count}/
moslashuvida xatolarga olib keladi. Bir nechta misollar;
+adverts/
.to/ad.php|
/addyn|*|adtech;
Men shunga o'xshash satrlarda xatoga yo'l qo'yaman, bu asosan "Quantifier regexp'da hech narsaga ergashmaydi". Bunga yo'l qo'ymaslik uchun regexp mos sintaksisida biror narsani o'zgartirishim kerakmi?