Xpoint
   [напомнить пароль]

Фильтры

Метки: [без меток]
[удл]
2006-12-05 14:57:47 [обр] пользователь удален

Господа, задача для первоклассников. Давно не работал с Perl, мне это оказалось не по силам. Задача очень проста. Если ip адреса в файле user.log нет, нужно его добавить.

open(FIL, "<$direct/user.log") or die "Can't open files $!\n";
flock(FIL,LOCK_SH);
my @fil =<fil>;
close(FIL) or die "Can't close file $!\n";

open(FIL, ">$direct/user.log") or die "Can't open files $!\n";
flock(FIL,LOCK_EX);
foreach (@fil) {
if($line eq $ip) {print FIL "$ip\n";}
}
close(FIL) or die "Can't close files $!\n";

Что я тут намудрил?

спустя 5 минут [обр] Алексей Севрюков(198/1280)[досье]
спустя 4 минуты [обр] sadgin(1/1)[досье]
сообщение промодерировано
можно например вот так.
open(FIL, "<user.log") or die "Can't open files $!\n";
my @fil =<FIL>;
close(FIL) or die "Can't close file $!\n";
my %ips;
map {chomp;$ips{$_} = 1 if($_)} @fil;
$ips{$ip} = 1;
open(FIL, ">user.log") or die "Can't open files $!\n";
print FIL join ("\n", keys %ips);
close(FIL) or die "Can't close files $!\n";
спустя 5 минут [обр] Алексей Севрюков(198/1280)[досье]
sadgin[досье] при большом количестве IP в списке Ваш скрипт будет расходовать очень много памяти.
спустя 1 час 51 минуту [обр] sadgin(1/1)[досье]
сообщение промодерировано
ну а если думать о памяти, то тогда вот так:
open(FIL, "<user.log") or die "Can't open files $!\n";
my $b = 0;
while (my $line = <FIL>) {
    chomp $line;
    $b = 1 if ($line eq $ip)
}
close(FIL) or die "Can't close file $!\n";
unless ($b) {
    open(FIL, ">> user.log") or die "Can't open files $!\n";
    print FIL $ip, "\n";
    close(FIL) or die "Can't close files $!\n";
}
спустя 1 час 37 минут [обр] Алексей Севрюков(198/1280)[досье]

sadgin[досье] c одним только изменением и увеличением эффективности:

if ($line eq $ip)
 {
  $b = 1;
  last;
 }

вместо:

$b = 1 if ($line eq $ip)

Зачем искать дальше, если IP уже найден.

спустя 3 дня [обр] Сергей Чернышев(2/589)[досье]
Ну, если нужна скорость, то IP-шники можно превратить в 4-х байтовые записи и сортировать по мере возрастания, а по файлу двигаться seek-ом - думаю можно найти оптимальный алгоритм поиска где-нибудь. Но самый простой способ на самом деле, положить это в MySQL в виде int-ов, оно будет как ветер летать.
Powered by POEM™ Engine Copyright © 2002-2005