Perl 是 Practical Extraction and Report Language 的缩写,可翻译为 "实用报表提取语言"。
Perl 是高级、通用、直译式、动态的程序语言。
Perl 最初的设计者为拉里·沃尔(Larry Wall),于1987年12月18日发表。
Perl 借用了 C、sed、awk、shell 脚本以及很多其他编程语言的特性。
Perl 最重要的特性是 Perl 内部集成了正则表达式的功能,以及巨大的第三方代码库CPAN。
以下代码为使用 Perl 输出 "Hello World!":
1 2 | #!/usr/bin/perl
print "Hello, World!\n";
|
Perl 语言的应用范围很广,除 CGI 以外,Perl 被用于图形编程、系统管理、网络编程、金融、生物以及其他领域。由于其灵活性,Perl 被称为脚本语言中的瑞士军刀。
Perl 与脚本语言一样,Perl 不需要编译器和链接器来运行代码,你要做的只是写出程序并告诉 Perl 来运行而已。这意味着 Perl 对于小的编程问题的快速解决方案和为大型事件创建原型来测试潜在的解决方案是十分理想的。
1. 运行 Perl
1.1 交互式
$perl -e <perl code> # Unix/Linux
C:>perl -e <perl code> # Windows/DOS
选项 | 描述 |
---|---|
-d[:debugger] | 在调试模式下运行程序 |
-Idirectory | 指定 @INC/#include 目录 |
-T | 允许污染检测 |
-t | 允许污染警告 |
-U | 允许不安全操作 |
-w | 许很多有用的警告 |
-W | 允许所有警告 |
-X | 禁用使用警告 |
-e program | 执行 perl 代码 |
file | 执行 perl 脚本文件 |
1.2 脚本执行
$perl script.pl # Unix/Linux
C:>perl script.pl # Windows/DOS
2. Perl 基础语法
2.1 语句
Perl 程序有声明与语句组成,程序自上而下执行,包含了循环,条件控制,每个语句以分号 (;) 结束。Perl 语言没有严格的格式规范,你可以根据自己喜欢的风格来缩进。
2.2 注释
perl 注释的方法为在语句的开头用字符 #。
perl 也支持多行注释,最常用的方法是使用 POD(Plain Old Documentations) 来进行多行注释。方法如下:
1 2 3 4 5 6 7 8 9 10 11 | #!/usr/bin/perl
# 这是一个单行注释
print "Hello, world\n";
=pod 注释
这是一个多行注释
这是一个多行注释
这是一个多行注释
这是一个多行注释
=cut
|
- =pod、 =cut只能在行首
- 以=开头,以=cut结尾
- =后面要紧接一个字符,=cut后面可以不用
2.3 空白
Perl 解释器不会关心有多少个空白。但是如果空格和分行出现在字符串内,他会原样输出。
2.4 引号
Perl 双引号和单引号的区别: 双引号可以正常解析一些转义字符与变量,而单引号无法解析会原样输出。
2.5 Here 文档
- 必须后接分号,否则编译通不过
- END 可以用任意其它字符代替,只需保证结束标识与开始标识一致
- 结束标识必须顶格独自占一行(即必须从行首开始,前后不能衔接任何空白和字符)
- 开始标识可以不带引号号或带单双引号,不带引号与带双引号效果一致,解释内嵌的变量和转义符号,带单引号则不解释内嵌的变量和转义符号
- 当内容需要内嵌引号(单引号或双引号)时,不需要加转义符,本身对单双引号转义
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | #!/usr/bin/perl
$a = 10;
$var = <<"EOF";
这是一个 Here 文档实例,使用双引号。
可以在这输如字符串和变量。
例如:a = $a
EOF
print "$var\n";
$var = <<'EOF';
这是一个 Here 文档实例,使用单引号。
例如:a = $a
EOF
print "$var\n";
|
执行以上程序输出结果为:
这是一个 Here 文档实例,使用双引号。
可以在这输如字符串和变量。
例如:a = 10
这是一个 Here 文档实例,使用单引号。
例如:a = $a
3. Perl 数据类型
Perl 是一种弱类型语言,所以变量不需要指定类型,Perl 解释器会根据上下文自动选择匹配类型。
Perl 有三个基本的数据类型:标量、数组、哈希。
3.1 标量
标量是 Perl 语言中最简单的一种数据类型。这种数据类型的变量可以是数字,字符串,浮点数,不作严格的区分。在使用时在变量的名字前面加上一个"$",表示是标量。
3.2 数组
数组变量以字符"@"开头,索引从0开始。
3.3 哈希
哈希是一个无序的 key/value 对集合。可以使用键作为下标获取值。哈希变量以字符"%"开头。
4. 数字字面量
4.1 整型
Perl 实际上把整数存在你的计算机中的浮点寄存器中,所以实际上被当作浮点数看待。
在多数计算机中,浮点寄存器可以存贮约16位数字,长于此的被丢弃。整数实为浮点数的特例。
8进制和16进制数:8进制以0开始,16进制以0x开始。
4.2 浮点数
浮点数数据如:11.4 、 -0.3 、.3 、 3. 、 54.1e+02 、 5.41e03
浮点寄存器通常不能精确地存贮浮点数,从而产生误差,在运算和比较中要特别注意。指数的范围通常为-309到+308。
4.3 字符串
Perl 中的字符串使用一个标量来表示,定义方式和 c 很像,但是在 Perl 里面字符串不是用0来表示结束的。
Perl 双引号和单引号的区别: 双引号可以正常解析一些转义字符与变量,而单引号无法解析会原样输出。但是用单引号定义可以使用多行文本。
4. 转义字符
转义字符 | 含义 |
---|---|
\\ | 反斜线 |
\' | 单引号 |
\" | 双引号 |
\a | 系统响铃 |
\b | 退格 |
\f | 换页符 |
\n | 换行 |
\r | 回车 |
\t | 水平制表符 |
\v | 垂直制表符 |
\0nn | 创建八进制格式的数字 |
\xnn | 创建十六进制格式的数字 |
\cx | 控制字符,x可以是任何字符 |
\u | 强制下一个字符为大写 |
\l | 强制下一个字符为小写 |
\U | 强制将所有字符转换为大写 |
\L | 强制将所有的字符转换为小写 |
\Q | 将到\E为止的非单词(non-word)字符加上反斜线 |
\E | 结束\L、\U、\Q |
5. Perl 变量
标量 \( 开始, 如\)a $b 是两个标量。
数组 @ 开始 , 如 \@a \@b 是两个数组。
哈希 % 开始 , %a %b 是两个哈希。
Perl 为每个变量类型设置了独立的命令空间,所以不同类型的变量可以使用相同的名称,你不用担心会发生冲突。例如 $foo 和 \@foo 是两个不同的变量。
变量不需要显式声明类型,在变量赋值后,解释器会自动分配匹配的类型空间。
5.1 Perl 标量
标量是一个简单的数据单元。
标量可以是一个整数,浮点数,字符,字符串,段落或者一个完整的网页。
5.1.1 特殊字符
以下我们将演示 Perl 中特殊字符的应用,如 __FILE__, __LINE__, 和 __PACKAGE__ 分别表示当前执行脚本的文件名,行号,包名。
注意: 是两条下划线,__FILE 前后各两条下划线。
这些特殊字符是单独的标记,不能写在字符串中,例如:
1 2 3 4 5 6 7 8 | #!/usr/bin/perl
print "文件名 ". __FILE__ . "\n";
print "行号 " . __LINE__ ."\n";
print "包名 " . __PACKAGE__ ."\n";
# 无法解析
print "__FILE__ __LINE__ __PACKAGE__\n";
|
文件名 test.pl
行号 4
包名 main
__FILE__ __LINE__ __PACKAGE__
5.1.2 v 字符串
用于十六进制:
1 2 3 4 5 6 7 8 9 | #!/usr/bin/perl
$smile = v9786;
$foo = v102.111.111;
$martin = v77.97.114.116.105.110;
print "smile = $smile\n";
print "foo = $foo\n";
print "martin = $martin\n";
|
Wide character in print at test.pl line 7.
smile = ☺
foo = foo
martin = Martin
5.2 数组
Perl 数组一个是存储标量值的列表变量,变量可以是不同类型。
数组变量以 \@ 开头。访问数组元素使用 $ + 变量名称 + [索引值] 格式来读取。