perl
参考文档
- 标量: 标量变量以$开头. 指向普通数据类型.
- 数组: 数组变量以@开头, 指向一个列表
- pop(@a) 操作尾部
- push(@a, $v)
- shift(@a) 操作头部
- unshift(@a, $v)
- splice(@a, $start, $end, @replace_a)
- 返回数组a从start到end之间的列表, 并将replace_a列表插入该位置
- 后两个参数是可选的.
- 也可以不删除, 直接插入, 只要$end传入0 , 就可以了
- foreach $v (@a) {}
- 默认变量
$_
- 默认变量
- each(@a)
- 每次调用each, 返回下一租元素的索引和值.
- reverse(@a)
- 返回倒序之后的数组, 但是不会改变传进来的参数
- sort(@a)
- 同样返回数组, 不改变参数
- 索引, 正索引从0到尾, 负索引从尾到0
- qw(): 生成字符串列表
如qw(a b c d e f)
###界定符
perl 允许使用任何标点符号做界定符, 比如 qw[], qw||, 或者任何一种括号.操作符
. 连接两个字符串
单引号, 用于包裹字符串
“” 双引号, 包裹字符串, 可以使用完整的转义字符, 可以内嵌变量
chr(n) 使用unicode码构造对应的字符变量
“\x{n}” 同上
ord() 将字符转换为对应的unicode码
.. 范围操作符, 如1 .. 100表示从1 到100, 只能向上计数< == 比较操作符, 比较数字
gt lt eq 比较操作符, 比较字符串
if / while
对应的逻辑块, 必须使用{}包围, 就算只有一句话.
chomp() 去掉字符串结尾的换行符
undef 没有被复制的标量变量
既不是数字, 也不是字符串. 但是在当数字使用时, 会当作0. 当字符串使用时. 会当作空字符串.
defined() 判断一个变量是否是undef, 如果是,返回假, 不是返回真.
my 用于定义局部变量
state 持久性私有变量, 多次调用保持它的值,并且作用域为当前代码块
return 从子程序返回
编译指令
用于指示编译器如何处理接下来的代码
- use strict 使用更严格的限制, 比如变量必须声明. 详见 perldoc strict
输入输出 I/O
- <STDIN> 获取用户输入
printf
- %g 按需输出数字形式
- %d %x %o 分别代表十/十六/八进制
- %f 浮点数
- %s 字符串
- 所有以上都可以使用 %[-]m.nf形式, 来控制输出的位数, 以及对齐方式
例: 例子中,_代表空格- printf(“%5d”, 1) 输出 ____1
- printf(“%-5d”, 1) 输出 1____
- printf(“%4.2f”, 1.1) 输出 1.1
- %% 百分号%
- 结合
x, 输出数组1
2@array = qw{asd fd rew};
printf "items: ". ("%10s\n" x @array), @array;
文件句柄
- 系统保留句柄名
- STDIN
- STDOUT
- STDERR
- DATA
- ARGV
- ARGVOUT
- 自定义句柄
openopen CONFIG "config"
open 使用一系列符号来声明句柄的操作方式与权限- < 小于号表示输入
- > 大于号表示输出
- >> 两个大于号表示追加
- 关闭句柄
close - binmode STDOUT, ‘:encoding(UTF-8)’;
指定使用utf8格式写入到标准输出流. - die 直接退出程序, 并输出错误信息
die "fatal error~~ ;
当系统调用失败时,$!变量存储了错误信息.可以用它来告诉用户. - warn 发出警告信息, 不会退出
- use autodie; 在一些不受程序控制的部分出错, 直接自动调用die.
- select HANDLE; 改变默认的文件输出句柄
- $| = 1; 每次输出操作后, 立即刷新缓冲区.
吐槽 好多各种类型的内置默认变量- 可以通过重新打开 系统预留句柄, 来修改默认输入输出
- 系统保留句柄名
正则表达式
- 用 m// 进行匹配
- 模式匹配修饰符
- /a 尽在ascll范围内解释 \w,\d等字符集
- /i 大小写无关
- /s 使
.号能匹配换行符 - /x 忽略模式中的空白符
- /m 对多行内容进行匹配
- /p 只针对特定的表达式, 开启自动捕获变量
- 锚位
- \A 字符串开头
- \z 字符串结尾
- \Z 行末
- ^ $ 有m修饰符时(行首 行末), 没有m修饰时与\A \z相同
- \b 单词首尾
- =~ 默认模式匹配的匹配对象是 $_, 使用=~表示用右边的模式串去匹配坐标的字符串.
- 捕获
- 捕获()/不捕获(?:)?
- 命名捕获
(?<name>)- 使用 $+{name}
- 反向引用使用
\g{name}或\k<name>
- 量词
- /a{n,m}/ 表示匹配字符a出现 n-m次 的所有情况
- a* /a{0,} 出现0到无穷次
- a+ /a{1,} 出现1到无穷次
- a? /a{0,1} 出现0或1次
- 优先级, 从高到底
- () 圆括号, 用于分组或捕获
- 量词 */+/? 或用于表示量词的花括号
- 锚位和序列
- | 多选一竖线
- 原子 字符,字符集, 反引用
文本替换
s/a/b/ 或者 s{a}{b}, 惯例: 这里的界定符都是可以用其他字符替换的.
修饰符
- /g 全局替换, 不加
/g则只替换一次 - /i , /x , /s 同上正则表达式部分
- /r 保留原操作字符串不变, 返回替换后的字符
1
my $copy = $origin =~ s/a/b/ r;
转义符
- \U 将跟在它后面的字符都转换成大写的
- \L 将跟在它后面的字符都转换成小写的
- \E 结束上面两个转义符的作用范围
- \u 将后面第一个字符大写
- \l 将后面第一个字符小写
- \L\u 后续首字符大写, 其余小写
split
my @feild = split /sp/, $str;
根据 sp分割符, 将str字符串分割成多段, 并存在数组中返回
- split /\s+/, $str 按空白符分割字符串, 默认行为
join
my $result = join $glue, @pieces;
将glue作为胶水, 插入pieces的每个间隙中, 返回结果字符串.
列表上下文中的m//
$_ = “test1 test2”;
my ($first, $sec) = m/(\S+) (\S+)/;
如果匹配, 则返回捕获变量的列表, 否则返回空列表.
非贪婪量词
每个贪婪量词都有它对应的非贪婪量词.
- 对应 +?
- 对应 *?
? 对应 ??
{m, n} 对应 {m, n}?
$^I
perl
https://leafflow.top/2016/04/12/other/perl-2016-04-12/