The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]




Версия для распечатки Пред. тема | След. тема
Новые ответы [ Отслеживать ]
PERL Use of uninitialized value in pattern match (m//), !*! Darktj, 18-Авг-09, 10:59  [смотреть все]
Всем доброго дня!
Стоит задача пропарсить Apache логи при помощи perl, при запуске скрипта выдает ошибку:

Use of uninitialized value in pattern match (m//) at pars.pl line 31.

Вот код:
#!/usr/bin/perl -w
use strict;


#Change this regular expression pattern according to your apache log forma.

my $LOG_PATTERN = q{(.*) \- \[(.*)\] \"(.*) (.*)\?(.*) HTTP\/(.*)\" ([0-9]*)
                    ([0-9]*) \"(.*)\" \"(.*)\" \"(.*)\" \"(.*)\" \-};

print $LOG_PATTERN;

my $len = @ARGV;
if ($len <1){
     print "Usage : perl script_name logfile\n";
     exit();
}

if (!(-e $ARGV[0])){
      print $ARGV[0]," not exists.\n";  
      exit();
}

#Open log file for reading.

open (SEM, "< $ARGV[0]") or die "Cannot open file $ARGV[0]\n";

while (){
      
       #We can also assign to a hash.
      
       if (my($ip,
              $date,
              $method,
              $url,
              $query,
              $protocol,
              $ret_code,
              $byte,
              $referer,
              $user_agent,
              $tc, $imp)=($_ =~ m/\'$LOG_PATTERN'/)){
              print "IP :",$ip, " referer:",$referer,"\n";
       }
}
close(SEM);

Подскажите пожалуйста как избежать эту ошибку, и с чем она связана?
Заранее благодарю за ХЕЛП:)

  • PERL Use of uninitialized value in pattern match (m//), !*! Michael, 11:10 , 18-Авг-09 (1)
    • PERL Use of uninitialized value in pattern match (m//), !*! Darktj, 11:17 , 18-Авг-09 (2)
      >
      >>Use of uninitialized value in pattern match (m//) at pars.pl line 31.
      >>
      >
      >в регулярку передается неинициализированное значение
      >англ-русский словарь рулит

      Может подскажешь как решить проблему и как и где её инициализировать плиииззз!

      • PERL Use of uninitialized value in pattern match (m//), !*! Michael, 13:06 , 18-Авг-09 (3)
        • PERL Use of uninitialized value in pattern match (m//), !*! Darktj, 16:06 , 18-Авг-09 (4)
          >я бы начал с
          >- while (){
          >+ while (defined(<SEM>)){

          не помогло выдаёт такую же ошибку!


          • PERL Use of uninitialized value in pattern match (m//), !*! Michael, 16:14 , 18-Авг-09 (5)
            • PERL Use of uninitialized value in pattern match (m//), !*! Darktj, 16:29 , 18-Авг-09 (6)
              >
              >>не помогло выдаёт такую же ошибку!
              >
              >значит причина в самой регулярке и как она используется. мне не совсем
              >нравится вот это m/\'$LOG_PATTERN'/.
              >а именно кавычки и обратный слеш

              Убрал эти кавычки и обратный слеш  толку это все никакого не дало!


              • PERL Use of uninitialized value in pattern match (m//), !*! Michael, 17:03 , 18-Авг-09 (7)
                • PERL Use of uninitialized value in pattern match (m//), !*! Darktj, 18:49 , 18-Авг-09 (9)
                  >в студию кусок лог файла, на котором можно воспроизвести ошибку

                  Michael огромное спасибо! Проблема решена, она заключалась в
                  1) "while (){" заменил на "while (<SEM>){"
                  2) "m/\'$LOG_PATTERN'/" убрал кавычки и обратный слэш "m/$LOG_PATTERN/"

                  Благодарю Michael за то что подсказал куда копать ;)

                  теперь скрипт выглядит так:
                  #!/usr/bin/perl -w
                  use strict;


                  #Change this regular expression pattern according to your apache log forma.

                  my $LOG_PATTERN = q{(.*) \- \[(.*)\] \"(.*) (.*)\?(.*) HTTP\/(.*)\" ([0-9]*) ([0-9]*) \"(.*)\" \"(.*)\" \"(.*)\" \"(.*)\" \-};


                  my $len = @ARGV;
                  if ($len <1){
                       print "Usage : perl script_name logfile\n";
                       exit();
                  }

                  if (!(-e $ARGV[0])){
                        print $ARGV[0]," not exists.\n";  
                        exit();
                  }

                  #Open log file for reading.

                  open (SEM, "< $ARGV[0]") or die "Cannot open file $ARGV[0]\n";

                  while (<SEM>){
                        
                         #We can also assign to a hash.
                        
                         if (my($ip,
                                $date,
                                $method,
                                $url,
                                $query,
                                $protocol,
                                $ret_code,
                                $byte,
                                $referer,
                                $user_agent,
                                $tc, $imp)=($_ =~ m/$LOG_PATTERN/)){
                                print "IP :",$ip, " date :",$date, " referer:",$referer,"\n";
                         }
                  }
                  close(SEM);


  • PERL Use of uninitialized value in pattern match (m//), !*! angra, 18:36 , 18-Авг-09 (8)



Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру