+ -
当前位置:首页 → 问答吧 → 帮我看下这段代码为啥总是报这样的错误

帮我看下这段代码为啥总是报这样的错误

时间:2010-08-31

来源:互联网

本帖最后由 heqidz 于 2010-08-31 12:34 编辑

分析apache 日志的
  1. #!/bin/env perl

  2. use strict;
  3. use warnings;
  4. use DBI;
  5. use POSIX qw#strftime#;

  6. my %serial;

  7. my %month = ('Jan'=>'01','Feb'=>'02','May'=>'03',
  8.                       'Apr'=>'04','May'=>'05','Jun'=>'06',
  9.                       'Jul'=>'07','Aug'=>'08','Sep'=>'09',
  10.                       'Oct'=>'10','Nov'=>'11','Dec'=>'12'
  11.                      );

  12. my $logdir = "/log/apache_log/201008apachelog";
  13. my $date = strftime "%m%d",localtime(time-86400);

  14. opendir LOG,"$logdir" or die "$!\n";

  15. while (my $file = readdir LOG) {
  16.          next unless $file =~ m{\d+_\d{2}$date.};
  17.          print $file . "\n";

  18.         open FILE,"$logdir/$file" or die "$!\n";
  19.       
  20.         while (my $str = <FILE>) {
  21.                 chomp $str;
  22.                 next if $str =~ m{^(127|::)};
  23.                 next unless $str =~ m{onfig}i;
  24.                my (@record) = $str =~ m{^(\S+).*(\d{2}/\w+/\d{4}):\d+.*&id=(\d+)};
  25.                my ($serial) = $str =~ m{serial=(\w+)};
  26.                next if (!$serial);
  27.                my ($svn) = $str =~ m{svn=(\w+)};
  28.                $svn = "" if (!$svn);
  29.                next if !$record[2] or $record[2] =~ m{^0};
  30.                my @tmpdate = split /\//,$record[1];
  31.                my $date = "$tmpdate[2]-$month{$tmpdate[1]}-$tmpdate[0]";
  32.                my $key = "$record[2]\t$serial\t$date";
  33.                $serial{$key} = "$record[0]\t$svn";
  34.         }
  35.         close FILE;
  36. }
  37. closedir LOG;

  38. my @array = ();
  39. my $sqlstr = "";

  40. for (sort keys %serial) {
  41.      my @tmpA = split /\t/,$_;
  42.      my @tmpB = split /\t/,$serial{$_};
  43.      my $values = "('$tmpA[0]','$tmpA[1]','$tmpA[2]','$tmpA[2]','$tmpB[1]','$tmpB[0]')";
  44.      push @array,$values;

  45.      if ($#array >= 10000) {
  46.          my @tmparray = splice @array,0,10000;
  47.          $sqlstr = join ",",@tmparray;
  48.          &addtomysql($sqlstr);
  49.      }
  50. }

  51. $sqlstr = join ",",@array;
  52. &addtomysql($sqlstr);

  53. sub addtomysql {
  54.     my $sql = shift;
  55.     my $dsn = "DBI:mysql:database=test;host=localhost;port=3306";
  56.     my $dbh = DBI->connect($dsn,'root','2010',{RaiseError=>1}) || die "$!\n";
  57.     my $insert_data = qq#INSERT INTO history VALUES $sql
  58.        ON DUPLICATE KEY UPDATE first_visit_date=least(first_visit_date,values(first_visit_date))
  59.        ,last_visit=greatest(last_visit,values(last_visit)),ip=values(ip)
  60.        #;

  61.     my $sth=$dbh->prepare($insert_data) or die "$insert_data:$dbh->errstr\n";
  62.          $sth->execute();
  63.          $sth->finish();
  64.          $dbh->disconnect();
  65. }
复制代码
报错信息
  1. Use of uninitialized value in concatenation (.) or string at ./test.pl line 52.
复制代码
老提示这一行有未初始化的值?
  1. my $values = "('$tmpA[0]','$tmpA[1]','$tmpA[2]','$tmpA[2]','$tmpB[1]','$tmpB[0]')";
复制代码
各位大大们,看一下,谢谢

作者: heqidz   发布时间: 2010-08-31

回复 heqidz


    就是说有个变量为空的意思嘛

作者: guap514   发布时间: 2010-08-31

本帖最后由 heqidz 于 2010-08-31 12:31 编辑

回复 guap514


呵,好象是$svn的值为空,我试试啊

作者: heqidz   发布时间: 2010-08-31

本帖最后由 heqidz 于 2010-08-31 12:40 编辑

回复 guap514

真是的,英文不好,没理解好,把$svn= 0,就好了,呵呵,谢了

作者: heqidz   发布时间: 2010-08-31