Perl语言

本文档来源 w3c_perl

1 环境

命令行下执行perl -v可以查看perl版本
可以用命令行执行perl脚本,也可以用eclipse的EPIC插件

2 基本语法

每个语句以分号;结束
没有缩进规范
单行注释:#
多行注释:
=pdo 顶头
xxxx
=cut 顶头
字符串可以使用单引号或者双引号
但是有区别: 单引号会照原样输出,双引号会进行转义字符解析
here文档 是一种在命令行shell和程序语言里定义一个字串的方法。
定义方法:
$var_name = <<'EOF';
xxxx
xxx
xxx
EOF
第一行后面必须接分号,结束标志和开始标志保持一致即可,不一定非要用EOF。开始标志可以不加引号或者加单双引号。
标识符区分大小写。

3 数据类型

perl弱数据类型,变量不需要指定类型。
三种基本数据类型: |数据类型|说明|表示| |:------:|:--:|:--:| |标量|可以是整数、浮点数、字符串|在变量的名字前加一个$表示标量| |数组|索引从0开始|在变量名之前加一个@表示数组| |哈希|哈希是无序的key/value对集合,以key作为下标获取值|在变量名之前加上%表示哈希| 数字字面量:
整型:0开头表示8进制数,0x开头表示16进制数
字符串:单引号和双引号都可以,但是单引号不会解析转义字符等,只会按照原样输出。

4 变量

三种类型(标量、数组、哈希)设置独立的命名空间,所以$foo和@foo是不同的。
定义数组:@age=(12,13,15); 访问数组变量:$array_name[index]
定义哈希: %hashname=(key1,value1,key2,value2); 访问hash的元素 $hashname

5 标量

字符串用单引号''时不会转义也不会进行变量引用,直接把单引号内的内容输出。
字符串连接 .
__FILE__ __LINE__ __PACKAGE__ 分别表示当前还行脚本的文件名、行号、包名。
v字符串:以v开头,后面跟着以句点分割的几个整数,会被当做一个字符串。整数为ascii码

6 数组

存储标量值的有序列表
数组的定义:元素放到括号(1,2,3)里或者用qw//来定义字符串列表 e.g.qw/xxx xxx xxx/
支持负数下标
另一种定义数组的方式:可以按序列输出的数组形式:(起始值..结束值) e.g.(1..10)
数组大小: 将数组直接赋值给一个标量即可得到数组大小 $biaoliang = @array; 操作数组的函数: |函数及用法|功能| |:-------:|:--:| |push @array,list|将list的值放到array后面| |pop @array|将数组最后一个弹出并返回| |shift @array|相当于把整个数组左移一格,弹出第一个值,剩余的索引值减一| |unshift @array,list|将list放在array的前面,返回新数组的元素个数| 数组切割:[1,2,3]或者[1..3]
替换数组元素 splice函数: splice(@array,start_index,num,list)
把array从下标为start_index的元素开始,替换num个,替换成list中的元素。 将字符串转化为数组 split函数:split(pattern,string,num) pattern分隔符,num可以没有,有的话表示返回该数组的元素个数
比如split('',youj,3)那么会分割成y o uj 将数组连接成字符串 join函数:join(连接符,list)
数组排序 sort函数:sort(list)或者sort(规则,list)
特殊变量 $[ 表示数组的第一个元素的索引值,一般不建议使用,新版perl中已废弃
合并数组: 逗号, @array3 = (@array1,@array2);

7 哈希

哈希是key/value对的集合
哈希变量以%开头,访问元素用$hashname
创建哈希:

  • 方式1 给每个key设置value $hash=value1;

  • 方式2 %hash=(key1,value1,key2,value2);

  • 方式3 %hash=(key1=>value1,key2=>value2);

将哈希值变成数组 @hashname{key1,key2};
读取哈希的key keys函数: keys %hashname;返回所有的key组成的数组。
读取哈希的value values函数:values %hashname;返回所有value组成的数组。
判断哈希中某个key是否存在 exists函数:exists($hashname);
获取哈希大小:先获取所有的key或者value,再由数组得到所有key或者value的数量。
向哈希添加元素:直接 $hashname=newvalue;即可
删除元素 delete函数:delete $hashname;

8 条件语句

注意:数字0,字符串“0”,空字符串“” 空list()和undef均为false。
? : 运算符
|语句|效果| |:--:|:--:| |if(boolean)|不用解释| |if(bool)else|不用解释| |if(bool1)elsif(bool2)...else|从上到下,只要一个为true则下面的都不会执行| |unless(bool)|unless = if not即bool为false时执行括号里的内容| |unless(bool)else|unless = if not| |unless(bool1)elsif(bool2)..else|从上到下,只要一个为true则下面的都不执行| |switch|需要Switc模块,与C语言里面的不一样|

9 循环

|语句|效果| |:--:|:--:| |while();|不用解释| |until(bool);|当bool为false的时候执行| |for(;;)|不用解释| |foreach var (@list)|不用解释| |dowhile();|不用解释| 循环控制语句
|语句|效果| |:--:|:--:| |next|后面如果不带label,效果是继续执行下一次循环| |last|后面如果不带label,效果是结束循环| |continue|用在while()/foreach var list continue.在条件语句再次判断之前执行,(每次循环执行完之后执行)| |redo|如果不带label的话,表示转到循环体第一行重新执行本次循环| |goto|goto label跳转到label所在语句执行 goto &name把正在运行的子进程换成一个已命名的子进程的调用|

10 运算符

求余数%
**乘幂 a ** b 表示a的b次方
⇔ 左边<右边返回-1 =返回0 >返回1
还有一些字符形式的运算符:
lt:less than
gt:
le:
ge:
eq:
ne:
cmp:和<=>一样 位运算:
^按位异或
~按位取反
逻辑运算: and &&
or ||
not
引号运算:相当于加引号: q加单引号
qq加双引号
qx加反引号
特殊运算符: .连接两个字符串
x重复字符串多次 e.g. ('-' x 3)为---

11 子程序/函数

sub 标识定义函数
sub subrouine_name{codes;};
调用函数 subrouine_name(参数列表)老版本5.0以前是 &subrouine_name(参数列表);现在不建议这样用
向函数传递参数: 1 全是标量参数时: 子程序可以接受多个参数,参数用特殊数组@_标明
所以参数依次是 $[0] $[1]....
2 参数含有标量和数组时:
数组参数放最后,所有参数会合成一个数组放到@_里面
3 参数含有哈希时:
哈希会被展开成key vallue的列表,然后复制到@_中
函数返回值:return。不适用return最后一句语句作为返回值。 默认情况下perl中的变量都是全局的。如果想声明私有变量需要使用my 标识符。
my $var;
my ($var,@array,%hash); 变量的临时赋值:local:为全局变量提供临时的值,在退出作用于之后还原成原来的值
静态变量 state和c语言中的static一样
子程序会根据上下文返回不同类型的值。

12 引用/指针

perl里面的引用是一个标量,可以指向标量、数组、哈希甚至函数
取引用 \
可以用引用指向 匿名数组[] 匿名哈希 以及 匿名子函数 sub ;
由引用到变量:应该根据指针指向的类型来分别还原: e.g. $p 是一个引用 $$p @$p %$p分别对应$p指向标量、数组和哈希时的方式。
确定引用指向的变量类型 ref函数: ref($p),返回值有以下几种:

  • SCALAR

  • ARRAY

  • HASH

  • CODE

  • GLOB

  • REF 引用函数: & 调用引用函数: &+创建的引用名e.g. &$p(args)

13 格式化输出

方式1:先定义一个format
format formatname =
fieldline
value_1,value2,....
filedline
value1,value2,....
.(表示format的结束)
pic2
fieldline称为格式行:
格式行以@或者^开头,不做任何形式的变量替换。后面跟着的< | >决定字段的长度,超出会被截断,<|>还分别表示左对齐、居中和右对齐。
这后面好像很复杂的样子,跳过了

14 文件操作

使用文件句柄来操作文件:句柄可以理解为指针。
三种句柄:STDIN STDOUT STDERR
打开文件可以使用open函数或者sysopen函数:
open FILEHANDLE,EXPR 或者
open FILEHANDLE
expr指定文件名以及访问类型(读写)
<file.c <表示以只读方式打开
> 表示以写方式打开
读写只需要在>或者<前加一个+
+< 不会删除文件原来的内容
+> 会删除文件原来的内容
>> 直接向现有文件末尾追加内容
+>> 可以读取追加的文件内容

pic2

使用完之后关闭文件 Close函数: Close FILE_HANDLE
读写文件的方式:

  • 方式1:

  • 方式2:getc函数: getc FILEHANDLE,不带FILEHANDLE默认为STDIN

  • 方式3: read函数读取二进制文件

print函数:print FILEHANDLE list向文件句柄指定文件写信息 默认STDOUT就成了直接向屏幕输出
文件重命名: rename函数 rename(oldname,newname);
删除文件 unlink函数: unlink(filename);
文件指针位置相关函数:
tell FILEHANDLE返回文件指针的位置,以字节计
seek FILEHANDLE,position,whence
position是移动字节数 whence是移动起始位置012分别表示文件开头,现在位置和文件结尾。
seek通过移动文件读写指针来进行读取或者写入文件。
文件信息:perl可以测试文件是否存在是否可读写等。
测试文件信息: 操作符 文件名
文件测试操作符:
pic2

15 错误处理

warn "string"输出警告信息
die "string"输出错误信息然后退出程序
Carp模块

16 特殊变量

perl语言定义了一些特殊变量,通常以@ $ %作为前缀
一般有比较长的英文名 use English模块才可以用。
1 在迭代循环foreach中,当前循环的字符串会放到 $_中,print不指定输出变量也是默认print $_
特殊变量表:。。。。 基本看不懂在说什么


本文章使用limfx的vsocde插件快速发布