搜索
您的当前位置:首页genesis脚本编程教材PERL

genesis脚本编程教材PERL

来源:世旅网
Perl学习笔记... 2

1. Perl简介... 2

2. 数据类型... 4

2.1概览... 4

2.2命名空间(Namespaces) 4

2.3标量(Scalars) 5

2.4数组(Arrays) 8

2.5关联数组(Hashes) 11

2.6引用(References) 12

2.6.1 Perl引用简介... 12

2.6.2 创建引用... 12

2.6.3 使用引用... 13

2.6.4 符号引用... 14

2.6.5 垃圾回收与弱引用... 15

2.7 数据结构... 16

2.7.1 Arrays of Arrays 16

2.7.2 Hash of Arrays 18

2.7.3 Arrays of Hashes 20

2.7.4 Hashes of Hashes 22

2.7.5 Hashes of Functions 24

3操作符(Operators)... 25

3.1 概述... 25

3.2 Perl操作符一览... 25

3.3 各种操作符使用说明... 27

3.3.1 项与左赋列表操作符... 27

3.3.2 箭头操作符... 27

3.3.3 自增自减... 27

3.3.4 乘方... 27

3.3.5 表意一元操作符... 28

3.3.6 捆绑操作符... 28

3.3.7 乘操作符... 28

3.3.8 加操作符... 28

3.3.9 移位操作符... 29

3.3.9 有名一元和文件测试操作符... 29

3.3.10 关系操作符... 30

3.3.11 位操作符... 31

3.3.12 C风格逻辑操作符... 31

3.3.13 范围操作符... 31

3.3.14 条件操作符... 31

3.3.14 赋值操作符... 32

3.3.15 逗号操作符... 32

3.3.16 逻辑and, or, not和xor操作符... 33

3.4 与C操作符的比较... 33

3.4.1 Perl操作符的特别之处... 33

3.4.1 C有Perl没有的操作符... 33

4. 语句... 33

4.1简单语句... 34

4.2复合语句... 34

4.2.1 条件语句(if/unless语句) 35

4.2.2 循环语句(while/until/for/foreach语句) 35

4.2.3 分支语句... 38

5. 子程序(函数)... 38

5.1子程序简介... 38

5.2 函数原型与属性... 40

5.3 Perl内部函数... 41

6. 文件、目录与I/O.. 42

6.1文件操作... 42

6.2 目录操作... 44

6.3 print/printf. 44

6.4 注意事项... 45

7. 模式匹配... 46

7.1模式匹配操作符简介... 46

7.2 模式修饰符... 47

7.3模式匹配操作符详解... 48

7.3.1 m//操作符(匹配) 48

7.3.2 s///操作符(替换) 49

7.3.3 tr///操作符(字译) 51

7.4元字符... 52

7.5常见问题的正则解决方案... 55

8. 面向对象编程... 55

8.1模块使用... 56

8.2对象使用... 56

9.Perl特殊变量... 58

10 Perl程序文档(POD) 60

11. Perl编程风格... 61

12. 参考文献... 62

学习笔记 简介

Perl一般被认为是Practical Extraction and Report Language(实用获取与报表语言)的缩写,是由C以及sed、awk、Unix shell及其它语言演化而来的一种语言。它由语言学家Larry Wall最初发明及实现。Perl是一种为扫描任意的文本文件,从这些文本文件中获取信息,基于这些信息打印报表而优化的语言。它也很适合于完成许多系统管理的任务。Perl是一种粘合性语言,旨在实用(易用、高效、完整)而不是漂亮(优美、小巧)。其吉祥物是骆驼,取其虽并不漂亮却任劳任怨、能干活之特点。

Perl不随意限制数据的大小,只要你有充足的内存。递归的深度也不受限制。关联数组使用可以根据需要扩展以避免性能衰退。Perl能利用复杂的模式匹配技巧来快速扫描大量数据。尽管善于处理文本,Perl也能处理二进制数据。

Perl 5增加了模块化处理、面向对象编程、引进引用以处理多维数组等复杂的数据结构、Unicode支持、多线程支持等功能,使得Perl成为一种更加完备强大的语言。(以上编译自Perl manpage的Perl语言简介)

Perl语言的座右铭是:There’s More Than One Way To Do It (TMTOWTDI,有多种方法可以完成一件事,或者“条条道路通北京”)。Perl是一种自然和智能语言,它能根据上下文环境解释执行,同时有大量省略写法。

如果你通常想使用sed、awk或sh来解决的问题,但是却发现它们的能力不够,或者想运行得更快一点,却不想傻傻地用C来写,Perl将是很好的选择。Perl擅长于文本处理和系统管理,不适合于实时嵌入式系统编程、操作系统底层开发(比如驱动程序开发)、复杂的多线

性共享内存应用以及极度大的应用。

Perl语言的长处:

l 强大的正则表达式和模式匹配功能(接近理想的正则表达式语言)

l 复杂灵活的数据结构(Array of Array, Array of Hash,Hash of Array, Hash of Hash等)

l Unicode支持(相对AWK与C)

其不足是:

l 动态类型语言,不是很可靠

l 自然语言,是优点也是缺陷,使得Perl语言代码可能晦涩难懂;

l 智能语言,是优点也产生不足:根据上下文解释编程者之意,可能产生臆断;也因此产生种种编程陷阱。

l 不是很优美。多种方法做事,有时会让编程者无所适从。

l 性能问题。Perl灵活的数据结构和处理性能通常不是很高(相对C/C++),若需要高性能的处理有时需要使用其它语言重写。

Perl语言的学习曲线浅而长。只要看看《Learning Perl》,就可以编写简单的Perl程序了,然而要深入掌握Perl,要使用Perl的复杂数据结构,进行面向对象编程、多线程编程则不是那么容易的事,需要很长的时间学习和实践。 概览

Perl有以下几种数据类型:标量(Scalars)、 数组(Arrays)、关联数组(Associative Arrays,或称Hash)、子程序(Subroutine)和Typeglob(*标识,指所有以上几种类型)。这些类型都有不同的符号标识。这些类型的说明如下: Type

Character Example Is a Name for Scalar $

$cents

An individual value(number or string) Array

@ @large

A list of values, keyed by number Hash %

%interest

A group of values, keyed by string

Subroutine & &how

A callable chunk of Perl code

Typeglob *

*struck

Everything named stuck

(以上引自《Programming Perl》)

关于Perl的类型可以做如下说明:

l 不同的数据类型不同的命名空间,所以三种的标识符可以相同但互不干扰,即$array, @array,%array是完全不同的三个变量。

l Perl的数据类型是大小写敏感的;直接使用,不用声明(这一点可能成为缺陷,可以使用use strict语句强制必须声明)

l 引用(references)是Perl 5引进的一种特殊的标量。

l 变量的命名以下划线或字母开头,可以是任意长度(1-251)。

l 文件句柄(Filehandle)指给一个文件、设备、Socket或管道的名称。

l 子程序相对其它类型是动词(其余为名词),较为特别,将用特别的一章详细说明

命名空间(Namespaces) Perl有两种命名空间,分别是符号表(symbol tables,也称为包(package))和词汇范围(lexical scopes,可以理解为局部空间)。符号表是存储全局变量的全局关联数组(包括存储其它关联数组),词汇范围是无名的空间,不存在于任何符号表中,而是与你程序中的一段代码块相关联。它们包含只对该代码块可见的变量。以our定义的变量存在符号表中,又称为全局

变量或包变量(它们对包来说名义上是私有的,但是由于包本身是全局的,所以又是全局的),以my定义的变量存储在词汇范围中,也称为局部变量。

在任一命名空间中,任一变量类型都有其子命名空间(由其前面的字符决定),用户可以给标量、数组、关联数组、文件句柄、子程序名、标号起相同的名字。Perl的保留字也不会与变量名冲突。

Perl做名字查找的次序如下:

l 查找最小一级的包含的程序块,看变量是否在同一块中声明(my或者our)

l 查找更高一级的包含程序块进行查找

l 查找整个编译单元看是否有声明

l 如果没有找到,Perl将假定变量是包变量

l 如果没有包定义,Perl将在无名的最高层包(main)中查找,$::bert等同于$main::bert

除了用my与our声明变量外,Perl中还有一种local的声明方式,注意local不是声明一个局部变量,而是使全局变量局部话,如果声明时未赋值,则所有的标量被初始化为undef, 所有的数组与关联数组被初始化为()。其使用方式比如:

if ($sw eq ‘-v’) {

local @ARGV = @ARGV;

unshift @ARGV, ‘echo’;

system @ARGV;

}

又如当需要输出CSV格式的文件时可以使用local $, = “,”; local $/=”\\n”; 免得每次print都得写许多”,”和最后的”\\n”;

标量(Scalars)

标量是一个字符串、数值或者指向某类型的引用。

Perl的数值常量可以如下使用:

$x = 12345; #整数

$x = 12345.67; #浮点数

$x = 6.02e23; #科学计数法

$x = 4_294_967_296; #因为,是分隔符,所以4,294,967,296不能成立,Perl用_代替

$x = 0377; #八进制

$x = 0xffff; #十六进制

$x = 0b1100_0000; #二进制

Perl的字符串常量通常由单引号或双引号括起来。双引号支持变量和转义字符序列替换;而单引号只支持两个转义字符 \\’和\\”。双引号支持的转义字符如下:

Code Meaning \\n

Newline (usually LF) \\r

Carriage return (usually CR) \

Horizontal tab \\f

Form feed \\b

Backspace \\a

Alert(bell) \\e

ESC character \\033

ESC in octal

\\x7f

DEL in hexadecimal \\cC

Control-C

\\x{263a}

Unicode (smiley)

\\N{NAME}

Named character (需要使用use charnames) \p":{"h":17.566,"w":17.979,"x":135.036,"y":392.368,"z":24},"ps":{"_enter":1},"s":{"letter-spacing":"-0.015

Force next character to uppercase \\l

Force next character to lowercase \\U

Force all following characters to uppercase \\L

Force all following characters to lowercase \\Q

Backslash all following nonalphanumeric characters \\E

End \\U, \\L, or \\Q

Perl除了使用单引号和双引号来引,还可以使用q//与qq//的更一般格式,Perl的引用结构如下:

Customary Generic Meaning Interpolates ‘’ q//

Literal String NO

ANDLE FORMAT, LISTprintf FORMAT, LIST(相当于print FILEHANDLE

因篇幅问题不能全部显示,请点此查看更多更全内容

Top