Perl 工作积累(不定期更新)

学会用 perl -c 检查语法, perl -e 直接执行语句, perldoc 查看文档 , CPAN 查找 module ...


1)url 判断是否合法:   /^(http:\/\/|https:\/\/)?((?:[A-Za-z0-9]+-[A-Za-z0-9]+|[A-Za-z0-9]+)\.)+([A-Za-z0-9]+)[\/\?\:]?.*$/

如果想不用\ 去转义 /, . , 等特殊字符,可以 /\Q$var\E/
在用 =~ 判断字符串包含时,需要注意是否包含空格等字符,特别是从文件中读出的时候,还要注意文件中的空白行 $context =~ s/^\s*\n//mg;

 Perl Code 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
my $file =  "blacklist.txt";
open(FILEIP, $file); 
while($var=<FILEIP>)
{       
     chomp $var;   # 去除换行
     if($var=~/^\s*(\S+)\s*$/)
    {
        $var=$1  # 去除左右空格
    }
     print  "-$var-\n";   #加些边界特殊字符打印,才能看出是否包含空格等字符
     if($site_name =~ /$var/)
    {       
         print  "match it...\n";
         last;   
    }       
}


2)什么时候需要转义:1. 比如在"" 里面还要使用",则\";  2. 一些特殊字符

3)数据库乱码问题:在脚本中查询的表和插入的表都要设置同样的编码如utf8($db_url->do(set names utf8)), 在secureCRT显示时设置UTF-8,查询数据库显示前set names utf8;

4)打log问题:如果log文件没权限写入,那会将log信息输出在标准输出。secureCRT sz/rz 也会遇到目录权限的问题

5)倒数据不要全量重新倒,可以设定时间起始点甚至表自增id,从文件读出写入;当tmmp表为空时,perl sql执行以下语句返回还是为真,需要再次判断idmax的值是否为""
mysql> select max(id) idmax from tmmp;                                                            
+-------+
| idmax |
+-------+
|  NULL |
+-------+

6)perl 对类型还是要注意,如$url为字符串,则如果判断 $url == 0 很可能为真,字符串比较尽量用 eq
    perl DBI 中的 my $ref = $sth->fetchrow_hashref();  $ref->{xxx} 返回的都是字符串?

7) perl 的print $log "xxx" ;  syswrite $log, "xxxx";     perl中的printf很多字符打印有问题,最好是使用syswrite来打印数据

8) > or >> 如果文件不存在都会创建,只是truncate or append的区别

9)sql 执行出错,页面出现很多乱码,包括log文件会有显示不了的字符,往往是因为插入的参数包含乱码,导致某些引号提早并上而执行出错,有种解决办法是只取参数的有些长度字段。

10)当log文件太大时,往往vim打开会显示为new file, 可以tail/head -n num file | more 来查看部分内容

11)$db->quote($url) 这样在插入sql时不用再对$url 加' ', 如果$url 内还有单引号会被转义; sql 执行出错很可能是引号提前闭合的问题

12) mysql> pager less  多页显示

13)  select substring_index('xxx.xxx.xx.22', '.', -1)  // 得到22

14) perl中的散列赋值都是引用拷贝而非值拷贝

15) perl打印shell脚本的结果信息之前需要先chomp结果,否则打印出来的信息不对

16)  取出url的后缀,如html, php等
    if ($url =~ /^(http:\/\/ | https:\/\/).*\/.*\.([^\/\.\?]+)/)
    {
          my $suffix = $2; 
    }

17) 从url中取出域名
      my @tmp = split(/:/, $url); my @tmp2= split(/\//, $tmp[1]);  my $domain = $tmp2[2];


18)svn convert string from utf-8 to naive encoding;  export LC_ALL=en_US.UTF-8


19)解析Http 头部信息

 Perl Code 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
sub HttpHeadrParse #解析http头部信息
{
     my $header =  shift;
#   $header =~s/\r\n/$~/g;
     my @element =  split(/\r\n/,$header);

     my %hash;
     my $key = "";
     my $var = "";
     my @tmp= "";
     foreach $var (@element)
    {
         if($var=~/POST./  or $var =~/GET./)
        {
            @tmp = split(/ /,$var);
            $hash{ "Method"} = $tmp[ 0];
            $hash{ "Cgi"} =$tmp[ 1];
#           print "method : $tmp[0] cgi: $tmp[1]\n";
            $hash{ "Protocol"} =$tmp[ 2];
        }
         else
        {
            @tmp =  split(/:/,$var);
            $hash{$tmp[ 0]}=$tmp[ 1];
             if($tmp[ 0eq  "Host")
            {
                 if($tmp[ 2eq  "")
                {
                    $hash[ "Port"] =  "80";
                }
                 else
                {
                    $hash[ "Port"] = $tmp[ 2];
                }
            }

        }
    }

     return %hash;
}

20)去除左右空格

 Perl Code 
1
2
3
4
5
6
7
sub trim
{
     my $string =  shift;
    $string =~  s/^\s+//;
    $string =~  s/\s+$//;
     return $string;
}

21)根据url, get, post 做md5 去重

 Perl Code 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#输入name,value字符串,name界定符;返回唯一的name列表
sub get_name{
     my $param =  shift;
     my $delim =  shift;
     return  ''  if ! defined($param) ||  $param  eq  '';
     my @name_value =  split( "$delim", $param);
     my %hash_name_value = ();
     for( my $i =  0; $i<= $ #name_value; $i++){
         my $name =  '';
         my $value =  '';
         if($name_value[$i] =~ /([^=]+)=(.*)/){
            $name = $1;
            $value = $2;
        }
         if($name =~ /[.\d]{ 10, 50}|1\d{ 9, 9}$/){  #去除随机数name
             next;
        }
        $hash_name_value{ "$name"} = $value;
    }
     my @names =  sort  keys %hash_name_value;
     my $names_str =  join( "$delim",@names);
     return $names_str;
}

#计算uniquemd5
sub uniquemd5{
     my ($url, $params, $query_get, $query_post) = @_;
     my $uniquemd5_str = $url;
     my $port =  0;
     my $q_get_name =  '';
     my $q_post_name =  '';
     my $p_name =  '';
    $q_get_name = get_name($query_get,  '&');
    $q_post_name = get_name($query_post,  '&');
    $p_name = get_name($params,  ';');
    
     if($url =~  m/(?:http|https):\/\/[^:\/;? #]+(?::([0-9]+))?/){
        $port = $1;
    }
     if( defined $port &&  80 == $port){
        $uniquemd5_str =~  s/:[ 0- 9]+//;
    }
    
    $uniquemd5_str .=  ",$p_name,$q_get_name,$q_post_name";
     my $md5 = Digest::MD5->new;
     my $uniquemd5 = $md5->add($uniquemd5_str)->hexdigest;
     return $uniquemd5;

}



你可能感兴趣的:(sql,perl,url,split,dbconnect)