- 必加模块 warnings和strict,即脚本最开始都添加上
use warnings; use strict;
use strcit可以直接找到很多简单的错误,但是要求所有的变量定义时都加上my
- 所有语句都以分号;结束
- 双引号转义输出,单引号原样输出
- 三种变量类型
- 标量 $ 任何引用标量的地方都以$开始
标量可以是数字、字符串等,变量之间可以通过.连接起来
- 数组 @
元素引用方法: $arr[0] $arr[1],可以连续引用 $arr[3..5]
数组大小获取: 直接把数组变量赋值给一个标量 $size = @arr;
数组可以直接复制: @copy = @arr;
数组序列号: 采用(起始值..结束值)格式,注意包括首尾
常用方法:
- 在数组尾部添加一个元素:push @arr ,var ; 或者直接对数组新下标赋值 $arr[5] = 10;
- 取出数组第一个元素: var = shift@arr
- 字符串转换为数组:@arr = split(‘pattern’,$str);注意pattern可以为不同字符,.时需要加转义\
- 数组转换为字符串:$str = join(‘expr’,@arr); 注意为.时不需要加转义\
- 哈希 %
元素引用方法: $hash{key}, %hash = (fgx’=> 10,’wcl’ => 25);
获取所有key: @arr = keys%hash; 通过@arr大小获得hash的大小
获取所有value @val = values%hash;
常用方法:
查看是否存在某个key: exists exists($hash{key})
添加删除元素: 添加直接赋值,删除使用delete $hash{key};
foreach迭代哈希: foreach my $i (keys%hash) 这样可以通$i,$hash{$i} 获得键值
while迭代哈希: while(($key,$val) =each%hash) 即通过each%hash直接获得key和value
- 流程控制 都是基于{ } 来取代begin..end
1)条件:if ... elsif ... else ? : 三目运算符
2)循环:for while foreach
跳出循环:last 相当于C中break
下次循环:next 相当于C中continue,注意perl中也有continue,和C中不一样
foreach 使用,可以用变量控制,从数组(列表)中依次取出元素
例如: foreach my $i (@arr)
例如: foreach (@arr) #此时每个元素默认迭代变量为$_
- 运算符
支持+,-,*,/,%,**等各种C中运算符
数字比较: >= <= == != 字符串比较: eq ne
逻辑运算:and && or || not
其他运算法: 字符串连接. 字符串重复x 例如 ‘a’ x 3 为aaa 范围.. 匹配=~ 不匹配 !~
- 常用函数
获取当前时间: localtime()
my ($sec,$min,$hour) = localtime() 获得秒、分、时
退出子进程: exit()
调用unix命令:
- 使用``,命令结果可以保存在一个数组中
- 使用system(‘ls -l’); 这样会执行unix命令输出到默认的终端,也是使用 > 重定向到文件
注意:如果使用的标量为$USER,最好使用’’,否则会识别为perl的变量$USER
- 函数
函数以sub name {} 定义,直接通过名字调用,可以传递参数,传递的参数不需要在定义时声明,默认所有的参数放在@_ 这个特殊数组里面,$_[0] 是第一个参数$_[1]是第二个参数,以此类推
- 文件操作
(1)打开文件 open(in_file, “< abc.txt”) or die “cannont open this file abc.txt $!”
注意点:
- 文件句柄不用声明,变量前不加$,后续操作直接引用in_file
- < 只读;> 只写;>> 追加; +> 读写;
- die 函数触发告警信息并且退出
- $! 是引起系统请求(如读写文件)失败的信息
- 文件操作 <文件句柄> 可以读出文件一行或整个
@data = <in_file>; 则把整个文件内容按行读出来放到数据@data中
while(<in_file>) {
print out_file $_;
}
while的方式文件逐行读出,每行内容为$_ 可以进行正则表达匹配或处理
可以通过print 句柄 内容;的方式向文件写入内容
- 判断文件是否存在
if( -e “abc.txt”)
if( -d ‘./tmp/’) #判断目录是否存在
- 目录操作
- 显示某个目录下的所有文件
@files = glob(“./tmp/*”); #glob 根据后面的目录加通配符搜索所有文件
- 打开某个目录,显示目录下所有文件
opendir(DIR,’.’) or die “cannot open this dir $!”;
while($file = readdir DIR) {
print $_.”\n”;
}
close DIR;
- 创建目录 mkdir
- 删除目录 rmdir
- 切换目录 chdir
- 特殊变量
$_ 可以作为迭代变量或文件输入的变量
@ARGV 传给脚本的命令行参数列表,可以通过这个解析命令参数,如$ARGV[0] 第一个参数,@ARGV 同时可以表示为数组size; 例如 ./proc.pl ‘abc.txt’ 则第一个参数为abc.txt
%ENV 当前环境变量,放在哈希数组里面,可以根据key查看对应的环境变量值
- 正则表达式
* + ? {} 默认为贪婪模式即尽可能多的匹配,比如匹配0次或多次,则尽可能按多次来匹配,要改为非贪婪模式在后面加? 即 *? +??? {}?
匹配:m// 可以简写为//
替换:s///
=~ 表示匹配,!~表示不匹配
常用选项:
- /i:取消大小写敏感性
- /s: .可以匹配任何字符,除了换行符为,如果要替换换行符,可以加选项/s
- /g: 替换所有,全局匹配
常用表达式:
.* 表示匹配0次或多次任何字符
.+ 表示匹配1次货多次任何字符
[] 表示匹配[]内的字符
\d 表示匹配数字
\w 表示匹配数字或英文字母
\s 表示匹配空格
\b 表示匹配英文字符或数字为边界的字符串
a|b|c 表示匹配a或b或c 匹配到一个则不在匹配后面
(pattern) 表示匹配pattern,把第一个()内的匹配的变量放入到$1,第二个()内的匹配变量放入到$2 即从左边是第x个(,把对应pattern放入到对应个数的$x 变量