专栏首页开发与安全Perl 工作积累(不定期更新)

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

学会用 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;

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];

18)解析Http 头部信息

19)去除左右空格

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

21)一次性读取整个文件内容

open my $fh, '<', 'file.txt' or die $!; #系统或库调用fail时会设置$!

my $content = do { local $/; <$fh> };

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 从零开始学C++之STL(三):迭代器类vector::iterator 和 vector::reverse_iterator 的实现、迭代器类型、常用的容器成员

    一、迭代器 迭代器是泛型指针 普通指针可以指向内存中的一个地址 迭代器可以指向容器中的一个位置 STL的每一个容器类模版中,都定义了一组对应的迭代器...

    s1mba
  • linux网络编程之共享内存简介和mmap 函数

    一、共享内存简介 共享内存区是最快的IPC形式,这些进程间数据传递不再涉及到内核,换句话说是进程不再通过执行进入内核的系统调用来传递彼此的数据。 ? 即每个...

    s1mba
  • 数据结构:队列的顺序存储结构(循环队列)

    队列(Queue)是只允许在一端进行插入操作,而在另一端进行删除操作的线性表。是一种先进先出的线性表(FIFO)。允许插入的一端称为队尾,允许删除的一端称为队头...

    s1mba
  • 比原链(Bytom)先知节点 Windows接入文档

    我们建议选择知名的VPS服务商,运行比原链节点对算力没有要求,但是请配置尽可能大的磁盘空间。

    比原链Bytom
  • Caffe2 - (六)CPU/GPU 模式切换

    在尝试把 Caffe 模型转换到 Caffe2,部署时 CPU/GPU 模式切换方法找了很久才找到一个用着可以,记录下.

    AIHGF
  • 你准备好了在云中工作吗?

    无服务器计算,容器化,云原生应用,DevOps,人工智能,机器学习以及混合云和多云解决方案等IT趋势正在成为主流或“新常态”。所有大小企业都在寻找具有许多热门趋...

    张善友
  • hadoop上搭建hive

    hadoop2.7.1+ubuntu 14.04 hive 2.0.1 集群环境 namenode节点:master (hive服务端) datanode 节点...

    王知无
  • 架构设计理念&模型

    今天我们还需要关注 DDD 吗?https://www.infoq.cn/article/should-we-focus-on-ddd

    xiaoxi666
  • 二进制情报推送记录

    [1] r3kapig HITCON CTF 2019 Writeup https://r3kapig.com/writeup/20191018-hitcon...

    0x222进制
  • ffmpeg 将视频转GIF

    本文使用的微信排版工具 https://github.com/lyricat/wechat-format

    苏生不惑

扫码关注云+社区

领取腾讯云代金券