Perl 工作积累(不定期更新)
来源:互联网 发布:美姿堂专业彩妆护淘宝 编辑:程序博客网 时间:2024/06/01 08:01
学会用 perl -c 检查语法, perl -e 直接执行语句, perldoc 查看文档 , CPAN 查找 module ...
# 注释; =pod ... =cut 多行注释
特殊变量:
$$ Perl解释器的进程ID
@ARGV 保存命令行参数
@_ 在子程序内,这个数组变量包含传递给子程序的参数
$_ 默认输入
$/ 当前输入记录分隔符,默认情况是新行
$! 根据上下文内容返回错误号或者错误串
$@ Perl解释器从eval语句返回的错误消息
$? 返回上一个外部命令的状态
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
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;
}
}
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文件会有显示不了的字符,往往是因为插入的参数包含乱码,导致某些引号提早并上而执行出错,有种解决办法是只取参数的有些长度字段。可以用参数绑定的方式,搜索 Binding Parameters to Statements。
10)当log文件太大时,往往vim打开会显示为new file, 可以tail/head -n num file | more 来查看部分内容
11)$db->quote($url) 这样在插入sql时不用再对$url 加' ', 如果$url 内还有单引号会被转义; sql 执行出错很可能是引号提前闭合的问题
the single/double quotes are are properly escaped (ie. \') but the backslashes are not escaped.
如果字符串中只是存在单一的 \(后面没有跟 ", ', \, n, r, b 等),那么db 将不插入任何字符。
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];
Perl Code
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[0] eq "Host")
{
if($tmp[2] eq "")
{
$hash["Port"] = "80";
}
else
{
$hash["Port"] = $tmp[2];
}
}
}
}
return %hash;
}
{
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[0] eq "Host")
{
if($tmp[2] eq "")
{
$hash["Port"] = "80";
}
else
{
$hash["Port"] = $tmp[2];
}
}
}
}
return %hash;
}
19)去除左右空格
Perl Code
2
3
4
5
6
7
sub trim
{
my $string = shift;
$string =~ s/^\s+//;
$string =~ s/\s+$//;
return $string;
}
{
my $string = shift;
$string =~ s/^\s+//;
$string =~ s/\s+$//;
return $string;
}
20)根据url, get, post 做md5 去重
Perl Code
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;
}
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;
}
21)一次性读取整个文件内容
open my $fh, '<', 'file.txt' or die $!; #系统或库调用fail时会设置$!
my $content = do { local $/; <$fh> };
15 0
- Perl 工作积累(不定期更新)
- 工作积累的一些代码教训(不定期更新)
- 消息使用的积累(不定期更新)
- 工作以后~流水账版(不定期更新)
- stl库积累(不定期更新
- 【前端学习笔记】项目经验积累(不定期更新)
- Cent OS 7命令积累(不定期更新)
- NOIP复赛模板及技巧积累(不定期更新)
- 工作中积累的一些验证基础知识的测试代码(以后不定期更新)
- 项目开发小经验积累 不定期更新~
- 推荐(不定期更新)
- 日记(不定期更新)
- TensorFlow及深度学习相关资料积累汇总【不定期更新】
- Debian 常用命令(不定期更新)
- MySql命令(不定期更新)
- const笔记(不定期更新)
- Linux常用命令(不定期更新)
- leetcode集锦 ( 不定期更新)
- 第十一章 11.3.2节练习
- mybatis与hibernate区别
- libpcap的安装、工作原理及流程(引用综合)
- css 相对浏览器动态居中
- if 语句1 条件语句用于测试条件。
- Perl 工作积累(不定期更新)
- 单链表整表创建和整表删除
- LightOj 1002 - Country Roads
- dedecms
- unity3d从零开始(二):学习GameObject
- 2015秋季校招淘宝笔试题
- vc中ShellExecute的使用(调用外部程序)
- 结构体,联合体,内存分配
- LayoutInflater的使用