Главная страница


ru.perl

 
 - RU.PERL ----------------------------------------------------------------------
 From : Andrey Chernomyrdin                  2:5020/400     10 Oct 2001  00:01:55
 To : All
 Subject : script oprimize
 -------------------------------------------------------------------------------- 
 
 Hi!
 
 Вот тут хотелось-бы отоптимизировать скрипт, так что хотелось-бы посоведоваться 
 с обществом как лучше это сделать для нижеприведенной программы (см. ниже)
 
 Смысл программы - на вход поток (log file) в командной строке задается
 произвольное количество пар regexp/filename, и собственно при нахождении
 заданного regexp, строка записывается в соответствующий файл. Смысл этого в том 
 что-бы за один проход по файлу (размер достаточно большой) вытащить все
 интересующие (соответствующие regexp-ам) фрагменты этого log файла.
 
 - --
 #!/usr/bin/perl -w
 #
 package   main;
 
 use   strict;
 
 use   Getopt::Long;
 use   IO::File;
 
 &main;
 
 1;
 
 sub main {
   my  $rc;
   my  @regexp  = ();
   my  @file   = ();
   my  @ls  = ();
   my  $lsptr  = undef;
   $rc = GetOptions(
    'regex=s'  => \@regexp,
    'file=s'   => \@file,
   );
 
   while( @regexp and @file ) {
    my(
       $re,
       $fn,
    );
 
    $re = shift @regexp;
    $fn = shift @file;
 
    push( @ls,
       LogSegment->new( $re, $fn )
    );
   }
   while( <> ) {
    $rc = 0;
    foreach $lsptr ( @ls ) {
       if( $lsptr->test( $_ ) ) {
        $rc++;
        last;
       }
    }
    print $_
       if( $rc == 0 );
   }
   foreach $lsptr ( @ls ) {
    $lsptr->close();
   }
 }
 
 package LogSegment;
 sub new {
   my  $class  = shift;
   my  $re  = shift;
   my  $fn  = shift;
   my  $self   = {};
 
   $self->{RE} = qr/$re/;
   $self->{FN} = $fn;
   $self->{FH} = new IO::File;
   bless( $self, $class );
   return $self;
 }
 
 sub close {
   my  $self   = shift;
 
   $self->{FH}->close()
    if( $self->{FH}->opened );
 }
 
 sub test {
   my  $self   = shift;
   local   $_  = shift;
   my  $rc  = 0;
 
   if( /$self->{RE}/ ) {
    if( not $self->{FH}->opened ) {
       $self->{FH}->open( $self->{FN}, "a" );
       $self->{LINES} = 0;
    }
    if( $self->{FH}->opened ) {
       $self->{FH}->print( $_ );
       $self->{LINES}++;
    }
    $rc = 1;
   }
   return $rc;
 }
 - --
 
 -- 
 With Best,
   Andrey <andrey@excom.spb.su>
 --- ifmail v.2.15dev5
  * Origin: X-Com Online (2:5020/400)
 
 

Вернуться к списку тем, сортированных по: возрастание даты  уменьшение даты  тема  автор 

 Тема:    Автор:    Дата:  
 script oprimize   Andrey Chernomyrdin   10 Oct 2001 00:01:55 
Архивное /ru.perl/64260e395a23.html, оценка 1 из 5, голосов 10
Яндекс.Метрика
Valid HTML 4.01 Transitional