perl

参考文档

  • learning perl
  • intermediate perl

    数据类型

  • 普通数据类型:
    • 数字
    • 字符串
  • 列表: 普通数据类型的集合
    • 列表不能成为列表里的元素
    • 列表的赋值
      • 左值必须全部是变量, 不能有常量
      • 多余的值会被丢弃
      • 缺少的值, 会被自动赋值为undef

        变量

  • 标量: 标量变量以$开头. 指向普通数据类型.
  • 数组: 数组变量以@开头, 指向一个列表
    • 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> 获取用户输入
  • print
  • 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
    • 自定义句柄 open
      open 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/
作者
vollen
发布于
2016年4月12日
许可协议