Home
Plicks
Plickers
Upload
search
Sign up
|
Log in
From
oula
RSS
Subscribe
Perl语言入门
Show Statistics
Views:
1384
Downloads:
30
Published:
April 14, 2008
1
Save to favorite
Ask author to sync audio with slides
Share
Mark as inappropriate
Perl语言入门
From:
oula
Views: 499 Comments: 0
See all
Perl语言入门
From:
oula
Views: 499
Comments: 0
See all
Place your Ad here for $2.00 a month
Sample Ad
Advertise your business on myplick.
Only $2.00 a month.
URL:
Embed
Thin Player
:
(fits in most blogs)
Embed
Full Player
:
Enter your comments:
Name
Email (will NOT be shown to other users)
Comments:
Notes:
Slide 1
: Perl 语言入门(第四版) Perl 语言入门 (第四版) 作者:Brian d foy, Tom Phoenix, Randal L.Schartz 译者: lebk 校对: 鄢元满 blei@163.com 1 / 201 9/21/2006
Slide 2
: Perl 语言入门(第四版) 目 录 前 言: ..................................................................................................................................................................................................8 第一章 概 述 ...............................................................................................................................................................................................9 1.1 问题和解答 ..................................................................................................................................................................................... 9 1.1.1 本书适合你吗? ........................................................................................................................................................................................9 1.1.2 为什么如此多的脚注?.............................................................................................................................................................................9 1.1.3 练习题和解答呢? .................................................................................................................................................................................. 10 1.1.4 习题前的数字是什么意思?................................................................................................................................................................... 10 1.1.5 如果我是 Perl 教师,怎么办呢? ..........................................................................................................................................................10 1.2 Perl 代表什么? ........................................................................................................................................................................ 11 Larry 为什么发明 Perl? ....................................................................................................................................................................... 11 1.2.1 1.2.2 为什么 Larry 不采用别的语言?............................................................................................................................................................ 11 1.2.3 Perl 容易学习吗? .................................................................................................................................................................................... 12 1.2.4 Perl 为什么如此流行? ............................................................................................................................................................................13 1.2.5 Perl 正在发生怎样的事情? .................................................................................................................................................................... 13 1.2.6 Perl 擅长什么?........................................................................................................................................................................................ 13 1.2.7 Perl 不擅长什么? .................................................................................................................................................................................... 14 1.3 怎样获得 Perl? ..........................................................................................................................................................................14 1.3.1 什么 CPAN ? ........................................................................................................................................................................................... 14 1.3.2 怎样获得支持? ...................................................................................................................................................................................... 15 1.3.3 有其它的支持吗? .................................................................................................................................................................................. 15 1.3.4 当发现 Perl 中有错误时,该怎么办? .................................................................................................................................................. 16 1.4 怎样才能写一个 Perl 程序?......................................................................................................................................................16 1.4.1 一个简单的例子 ...................................................................................................................................................................................... 17 1.4.2 这个程序有些什么? .............................................................................................................................................................................. 18 1.4.3 怎样编译 Perl?........................................................................................................................................................................................ 19 1.5 快速了解 Perl ..............................................................................................................................................................................19 1.6 第六节 练习 ................................................................................................................................................................................. 20 第二章 标量数据 ....................................................................................................................................................................................... 21 2.1 数字 .............................................................................................................................................................................................. 21 2.1.1 所有数字内部的格式一致........................................................................................................................................................................21 2.1.2 浮点数 ...................................................................................................................................................................................................... 21 2.1.3 整数 .......................................................................................................................................................................................................... 22 2.1.4 非十进制整数 ........................................................................................................................................................................................... 22 2.1.5 数字操作符 ............................................................................................................................................................................................... 23 2.2 字符串 .......................................................................................................................................................................................... 23 2.2.1 单引号字符串 ........................................................................................................................................................................................... 24 2.2.2 双引号字符串 ........................................................................................................................................................................................... 24 2.3.3 字符串操作符 ........................................................................................................................................................................................... 25 2.2.4 数字和字符串之间的自动转换................................................................................................................................................................ 26 2.3 Perl 内嵌的警告(warnings).......................................................................................................................................................... 26 blei@163.com 2 / 201 9/21/2006
Slide 3
: Perl 语言入门(第四版) 2.4 标量变量 ......................................................................................................................................................................................27 2.4.1 选择好的变量名 .......................................................................................................................................................................................28 2.4.2 标量赋值 ................................................................................................................................................................................................... 28 2.4.3 二元赋值操作符 ...................................................................................................................................................................................... 29 2.5 print 输出 ......................................................................................................................................................................................29 2.5.1 字符串中标量变量的内插........................................................................................................................................................................30 2.5.2 操作符优先级和结合性............................................................................................................................................................................31 2.5.3 比较运算符 ............................................................................................................................................................................................... 32 2.6 if 控制结构 ....................................................................................................................................................................................33 2.6.Boolean 值 .................................................................................................................................................................................................... 33 2.7 用户输入 ......................................................................................................................................................................................34 2.8 chomp 操作....................................................................................................................................................................................35 2.9 while 控制结构 ..............................................................................................................................................................................35 2.10 undef 值 ....................................................................................................................................................................................... 36 2.1.1 defined 函数............................................................................................................................................................................37 2.1.2 练习 ........................................................................................................................................................................................37 第三章 列表和数组 ................................................................................................................................................................................... 38 3.1 访问数组元素 ..............................................................................................................................................................................39 3.2 特殊的数组索引 ..........................................................................................................................................................................39 3.3 列表 ...............................................................................................................................................................................................40 3.3.1 qw 简写 .................................................................................................................................................................................................... 41 3.4 列表赋值 ......................................................................................................................................................................................42 3.4.1 pop 和 push 操作 .......................................................................................................................................................................................43 3.4.2 shift 和 unshift 操作 .................................................................................................................................................................................. 44 3.5 将数组插入字符串 ....................................................................................................................................................................... 44 3.6 foreach 控制结构 ..........................................................................................................................................................................45 3.6.1 Perl 最常用的默认变量:$_ .................................................................................................................................................................... 46 3.6.2 reverse 操作............................................................................................................................................................................................... 46 3.6.3 sort 操作 .................................................................................................................................................................................................... 47 3.7 标量和列表上下文 ....................................................................................................................................................................... 47 3.7.1 在标量 Context 中使用 List-Producing 表达式 ....................................................................................................................................... 48 3.7.2 在列表 Context 中使用 Scalar-Producing 表达式.................................................................................................................................... 50 3.7.3 强制转换为标量 Context ......................................................................................................................................................................... 50 3.8<STDIN>在列表 Context 中.......................................................................................................................................................... 50 3.9 练习 .............................................................................................................................................................................................. 51 第四章 子程序 ...........................................................................................................................................................................................53 4.1 定义一个子程序 ..........................................................................................................................................................................53 4.2 调用子程序 ..................................................................................................................................................................................54 4.3 返回值 .......................................................................................................................................................................................... 54 4.4 参数(Arguments) ..........................................................................................................................................................................56 4.5 子程序中的私有变量 ..................................................................................................................................................................57 4.6 参数列表的长度 ........................................................................................................................................................................... 57 4.6.1 更好的&max 程序 ...................................................................................................................................................................................58 4.6.2 空参数列表 ............................................................................................................................................................................................... 59 blei@163.com 3 / 201 9/21/2006
Slide 4
: Perl 语言入门(第四版) 4.7my 变量的注释............................................................................................................................................................................... 59 4.8 使用 strict Pragma ........................................................................................................................................................................60 4.9 返回操作 ......................................................................................................................................................................................61 4.9.1 省略符号& ............................................................................................................................................................................................... 62 4.10 非标量返回值 ............................................................................................................................................................................63 4.11 练习 .............................................................................................................................................................................................64 第五章 输入与输出 ................................................................................................................................................................................... 65 5.1 从标准输入设备输入 ................................................................................................................................................................... 65 5.2 从<>输入 ......................................................................................................................................................................................66 5.3 调用参数 ....................................................................................................................................................................................... 68 5.4 输出到标准输出设备 ................................................................................................................................................................... 69 5.5 使用 printf 格式化输出................................................................................................................................................................. 71 5.5.1 数组和 printf .................................................................................................................................................................................................. 72 5.6 句柄 ...............................................................................................................................................................................................73 5.7 文件句柄的打开 ........................................................................................................................................................................... 74 5.7.1 Bad 文件句柄............................................................................................................................................................................................ 76 5.7.2 关闭文件句柄 ........................................................................................................................................................................................... 76 5.8 严重错误和 die ............................................................................................................................................................................77 5.8.1 警告信息和 warn ..................................................................................................................................................................................... 78 5.9 使用文件句柄 ............................................................................................................................................................................... 78 5.9.1 改变默认的输出句柄 ...............................................................................................................................................................................79 5.10 重新打开文件句柄 ....................................................................................................................................................................79 5.11 练习 ............................................................................................................................................................................................ 80 第六章 哈 希............................................................................................................................................................................................ 81 6.1 什么是哈希? ............................................................................................................................................................................... 81 6.1.1 为什么使用 Hash? ...................................................................................................................................................................................82 6.2 哈希元素的存取 ........................................................................................................................................................................... 84 6.2.1 作为整体的 hash .......................................................................................................................................................................................85 6.2.2 Hash 赋值 .................................................................................................................................................................................................86 6.2.3 大箭头符号(=>) .................................................................................................................................................................................. 87 6.3 哈希函数 ....................................................................................................................................................................................... 87 6.3.1 keys 和 values 函数 ...................................................................................................................................................................................87 6.3.2 each 函数................................................................................................................................................................................................... 88 6.4 哈希的通常用法 ........................................................................................................................................................................... 89 6.4.1 exists 函数 .................................................................................................................................................................................................90 6.4.2 delete 函数.................................................................................................................................................................................................90 6.4.3 hash 元素的内插 .......................................................................................................................................................................................90 6.5 练习 ...............................................................................................................................................................................................91 第七章 正则表达式 ................................................................................................................................................................................... 92 7.1 什么是正则表达式? ................................................................................................................................................................... 92 7.2 使用简单的模式 ........................................................................................................................................................................... 93 7.2.1 元字符 ...................................................................................................................................................................................................... 93 7.2.2 简单的量词 ..............................................................................................................................................................................................94 7.2.3 模式中的分组 ........................................................................................................................................................................................... 94 blei@163.com 4 / 201 9/21/2006
Slide 5
: Perl 语言入门(第四版) 7.2.4 选择符 ...................................................................................................................................................................................................... 94 7.3 字符类 ...........................................................................................................................................................................................95 7.3.1 字符类的简写 ........................................................................................................................................................................................... 95 7.3.2 简写形式的补集 ...................................................................................................................................................................................... 96 7.4 练习 ...............................................................................................................................................................................................96 第八章 正则表达式的应用 ....................................................................................................................................................................... 98 8.1 使用 m//匹配 ................................................................................................................................................................................98 8.2 可选的修饰符 ............................................................................................................................................................................... 98 8.2.1 不区分大小写:/i ..................................................................................................................................................................................... 98 8.2.2 匹配任何字符:/s..................................................................................................................................................................................... 99 8.2.3 添加空格:/x ............................................................................................................................................................................................ 99 8.2.4 将可选字符结合起来 ............................................................................................................................................................................100 8.2.5 其它选项 .................................................................................................................................................................................................100 8.3 锚定 .............................................................................................................................................................................................100 8.3.1 词锚定 .................................................................................................................................................................................................... 101 8.4 绑定操作符,=~ ........................................................................................................................................................................101 8.5 模式内的内插 ............................................................................................................................................................................102 8.6 匹配变量 ....................................................................................................................................................................................103 8.6.1 内存值的保存 ........................................................................................................................................................................................104 8.6.2 自动匹配变量 ......................................................................................................................................................................................... 105 8.7 一般的数量词 ............................................................................................................................................................................. 106 8.8 优先级 ......................................................................................................................................................................................... 106 8.8.1 优先级练习 ............................................................................................................................................................................................. 107 8.8.2 更多 .........................................................................................................................................................................................................107 8.9 模式测试程序 ............................................................................................................................................................................107 8.10 练习 ...........................................................................................................................................................................................108 第九章 使用正则表达式处理文件 ......................................................................................................................................................... 109 9.1 使用 s///进行替换 ....................................................................................................................................................................... 109 9.1.1 使用/g 进行全局替换 ............................................................................................................................................................................. 110 9.1.2 不同的分隔符 ......................................................................................................................................................................................... 110 9.1.3 可选的修饰符 ........................................................................................................................................................................................ 111 9.1.4 绑定操作 ................................................................................................................................................................................................ 111 9.1.5 大小写转换 ............................................................................................................................................................................................. 111 9.2split 操作 ...................................................................................................................................................................................... 112 9.3join 函数 ....................................................................................................................................................................................... 113 9.4 列表上下文中的 m// .................................................................................................................................................................. 114 9.5 更强大的正则表达式 ................................................................................................................................................................. 114 9.5.1 非贪婪的数量词 ..................................................................................................................................................................................... 115 9.5.2 匹配多行文本 ........................................................................................................................................................................................ 116 9.5.3 更新大量文件 ......................................................................................................................................................................................... 117 9.5.4 在命令行中进行修改 ............................................................................................................................................................................ 119 9.5.5 非捕捉用的括号 ....................................................................................................................................................................................120 9.6 练习 .............................................................................................................................................................................................121 第十章 更多控制结构 ............................................................................................................................................................................. 122 blei@163.com 5 / 201 9/21/2006
Slide 6
: Perl 语言入门(第四版) 10.1unless 控制结构 ......................................................................................................................................................................... 122 10.1.1unless 和 else 语句一起使用 .................................................................................................................................................................122 10.2until 控制结构 ............................................................................................................................................................................123 10.3 表达式修饰符 ........................................................................................................................................................................... 123 10.4The Naked Block 控制结构 ........................................................................................................................................................ 125 10.5 elsif 语句....................................................................................................................................................................................126 10.6 自增和自减 ............................................................................................................................................................................... 126 10.6.1 自动增量的值 .......................................................................................................................................................................................127 10.7for 控制结构............................................................................................................................................................................... 128 10.7.1foreach 和 for 的关系 .............................................................................................................................................................................130 10.8 循环控制 ................................................................................................................................................................................... 130 10.8.1 last 操作.................................................................................................................................................................................................131 10.8.2 next 操作 ...............................................................................................................................................................................................131 10.8.3 redo 操作 ...............................................................................................................................................................................................132 10.8.4 标签块 ...................................................................................................................................................................................................133 10.9 逻辑操作符 ............................................................................................................................................................................... 134 10.9.1 短路操作的值 .......................................................................................................................................................................................135 10.9.2 三元操作符 ?: ...................................................................................................................................................................................... 135 10.9.3 控制结构:使用部分求值的操作符 ....................................................................................................................................................136 10.10 练习 ......................................................................................................................................................................................... 138 第十一章 文件检验 ................................................................................................................................................................................. 139 11.1 文件检测操作 ............................................................................................................................................................................139 11.2 stat 和 lstat 函数 ........................................................................................................................................................................142 11.3 localtime 函数 ............................................................................................................................................................................143 11.4 位操作........................................................................................................................................................................................ 144 11.4.1 使用位串 ...............................................................................................................................................................................................145 11.5 使用特殊的下划线文件句柄 ....................................................................................................................................................145 11.6 练习 ...........................................................................................................................................................................................146 第十二章 目录操作 ................................................................................................................................................................................. 147 12.1 在目录树上移动 ....................................................................................................................................................................... 147 12.2 Globbing....................................................................................................................................................................................147 12.3 Globbing 的替换语法 ...............................................................................................................................................................148 12.4 目录句柄 ................................................................................................................................................................................... 149 12.5 递归的目录列表 ....................................................................................................................................................................... 151 12.6 操作文件和目录 ....................................................................................................................................................................... 151 12.7 删除文件 ................................................................................................................................................................................... 151 12.8 重命名文件 ............................................................................................................................................................................... 152 12.9 连接和文件 ............................................................................................................................................................................... 153 12.10 创建和删除目录 ..................................................................................................................................................................... 157 12.11 修改权限..................................................................................................................................................................................159 12.12 改变所有者 ............................................................................................................................................................................. 159 12.13 改变时间戳 ............................................................................................................................................................................. 159 12.14 练习 ......................................................................................................................................................................................... 160 第十三章 字符串和排序 ......................................................................................................................................................................... 161 blei@163.com 6 / 201 9/21/2006
Slide 7
: Perl 语言入门(第四版) 13.1 使用索引寻找子串 ................................................................................................................................................................... 161 13.2 使用 substr 操作子串................................................................................................................................................................ 162 13.3 使用 sprintf 格式化数据...........................................................................................................................................................163 13.3.1 在“货币数字”中使用 sprintf ............................................................................................................................................................164 13.4 高级排序 ................................................................................................................................................................................... 165 13.4.1 依据值对 Hash 进行排序 .....................................................................................................................................................................168 13.4.2 对多个 keys 排序 .................................................................................................................................................................................. 168 13.5 练习 ...........................................................................................................................................................................................169 第十四章 进程管理 ................................................................................................................................................................................. 171 14.1 系统函数 ................................................................................................................................................................................... 171 14.1.1 避免 Shell..............................................................................................................................................................................................172 14.2exec 函数 ....................................................................................................................................................................................174 14.3 环境变量 ................................................................................................................................................................................... 174 14.4 使用反引号捕捉输出 ...............................................................................................................................................................175 14.4.1 在 List context 中使用反引号...............................................................................................................................................................177 14.5 像文件句柄那样处理 ...............................................................................................................................................................178 14.6 使用 fork....................................................................................................................................................................................179 14.7 发送和接收信号 ....................................................................................................................................................................... 180 14.8 练习 ...........................................................................................................................................................................................182 第十五章 PERL 模块................................................................................................................................................................................183 15.1 查找模块 ................................................................................................................................................................................... 183 15.2 安装模块 ................................................................................................................................................................................... 183 15.3 使用简单的模块 ....................................................................................................................................................................... 184 15.3.1. File::Basename 模块.........................................................................................................................................................................185 15.3.2.仅使用模块中的一些函数.................................................................................................................................................................186 15.3.3.File::Spec 模块 ...................................................................................................................................................................................187 15.3.4.CGI.pm ...............................................................................................................................................................................................188 15.3.5.数据库和 DBI .......................................................................................................................................................................................189 15.4 练习 ...........................................................................................................................................................................................190 第十六章 一些高级的 PERL 技术 ...........................................................................................................................................................191 16.1 利用 eval 捕获错误................................................................................................................................................................... 191 16.2 使用 grep 在列表得到元素 ......................................................................................................................................................193 16.3 使用 map 对列表项进行变换 ................................................................................................................................................... 194 16.4 不用双引号的 hash keys ...........................................................................................................................................................195 16.5Slices...........................................................................................................................................................................................195 16.5.1 Array Slice............................................................................................................................................................................................. 197 16.5.2Hash Slice...............................................................................................................................................................................................198 16.6 练习 ...........................................................................................................................................................................................200 练习题答案 .............................................................................................................................................................................................. 201 blei@163.com 7 / 201 9/21/2006
Slide 8
: Perl 语言入门(第四版) 前 感谢我的家人。是你们给与了我一切。无论走到哪里,你们都让我感到温暖和充满勇气。 感谢我的女朋友:红梅。你对我的照顾和给予我的爱,让我的生命变得完整。 感谢我的朋友阿满在百忙之中抽出时间校对。但本书质量应完全由译者负责。 言: 感谢出现在我生命中所有的人。那些和我一起逃学,一起罚站,一起偷邻居甘蔗的伙伴;那些和我一起抽烟,一起喝酒, 一起唱歌侃大山的同学;那些天冷提醒我穿衣,过马路提醒我小心的知己朋友;还有那些和我斗嘴的,和我打架的,是你 们锻炼了我的口才,是你们强壮了我的身体。你们还好吗? 最后我想说:当你很饿,面对美味佳肴,请不要急于动筷子;当你很渴,面对清泉甘露,请不要急于动嘴;当你很冷,面 对暖炕热被,请不要急于动腿。当你所渴望的东西正在你眼前的时候,请放慢你的脚步,用心去感受。 lebk blei@163.com 8 / 201 9/21/2006
Slide 9
: Perl 语言入门(第四版) 第一章 概 述 欢迎使用小骆驼书。 本书是第四版,自 93 年以来,有超过 50 万的读者喜欢它。至少,我们希望他们喜欢它。不管怎样,我们写此书时非常开 心◆。 ◆本书第一版由Randal L.Schwartz 著, 第二版由 Randal, Tom Christiansen 著, 第三版由 Randal, Phoenix 著,本版由 Randal, Tom Ponenix, Tom 和 brian foy 著。因此,在本版中,当说“我们”时,指的是最后三位。现在,你可能猜想,为什么在第一页就说写本书我们非常开心 (过去时态) ,理由很简单:因为我们是从后往前写的。这听起来很奇怪。但是,坦白讲,当写完索引后,剩下的就变的很容易了。 1.1 问题和解答 你或许对 Perl 有些疑问,也可能是针对本书,特别是当你已经大致浏览本书后。因此,我们将用本章来回答这些问题。 1.1.1 本书适合你吗? 如果你和我们类似,那你很可能正站在书架前◆,考虑是否要买这本羊骆驼书来学习 Perl 或是买另一本由蛇(有迂回的 含义) ,饮料,或者一些字母命名的语言◆的书。你站了两分钟,书店经理走过来通知你这不是图书馆◆,你要么买要么 快点离开。可能,你利用这两分钟时间来查看一个 Perl 程序,来了解其强大功能以及它能完成怎样的工作。如果是那样 的话,您因该浏览本章剩下的章节。 ◆实际上,如果和我们一样,你因该站在图书馆,而不是书店。当然我们有一点吝啬。 ◆在你写信告诉我们那是段愉快,而非迂回(伤脑筋)的历程之前,其实我们想的是 CORBA。 ◆除非它是,否则 1.1.2 为什么如此多的脚注? 感谢你注意到这些。本书中有大量的脚注。忽略它们就行了。我们需要脚注的原因是 Perl 中有大量的异常。这是好事情, 因为生活本身就充满了意外。 但这并不意味着我们不能老实的写: “The fizzbin operator frobnicates the hoozistatic variables”◆,而不写任何脚注来描述 异常情况。 事实上, 我们相当老实,所以我们写了脚注。 但你可以老老实实的忽略它们。 (这种解决办法听起来相当有趣) 。 许多异常和移植性相关。Perl 最早在 Unix 系统中使用,因此它和 Unix 渊源极深。但只要有可能,我们就演示它非预期的 blei@163.com 9 / 201 9/21/2006
Slide 10
: Perl 语言入门(第四版) 行为,无论这种结果是由 non-Unix 系统,还是别的原因引起的。我们希望那些对 Unix 一无所知的读者也认为本书是一本 好的 Perl 教程。 (同时,也能附带学些 Unix 的知识) 。 其余的大量的异常都和“80/20”规则相关。我们是指 80% 的 Perl 可用 20%的篇幅介绍。剩下的 20%需要 80%篇幅。为了 保持本书的大小,我们将在正文中介绍最常用的,最容易讲明白的内容,在脚注中介绍别的(它们字体更小,因此可以在 相同的空间内写入给多的内容)◆但你学习本书时,如果没有阅读脚注,很可能在后面的章节中需要回过头来查看。如果 是那样,或者在学习的过程中,出于好奇,那就读读这些脚注吧。尽管大多数脚注只是一些计算机的笑话。 我们甚至讨论为了节省纸张,把整本书用脚注组成,但脚注跟着脚注看起来有些疯狂。 1.1.3 练习题和解答呢? 练习题在每章的末尾。由于我们三人向几千人介绍相同的材料◆。因此我们仔细的选择了这些习题,让你更有机会犯错。 ◆不是同时的 并不是我们希望你犯错,而是你需要这种经验。因为在 Perl 生涯中,这些是你最可能犯的错误,因此我们现在就应当提 醒你。那些在阅读本书时犯的错误,可能不会在项目的终止日期时重犯。当你出错是我们会帮助你找到错误的原因;附录 A 有每一个习题的解答,和小段注释。当完成习题时请检查答案。 不要在仔细尝试之前看答案。自己解决比读解答学的更牢靠。如果没有找到答案,也不要太伤心。继续阅读下一章。 如果你完全没有犯错误,也因当在完成时看下答案。解答的注释中可能有关于这段程序的一些不明显地方的介绍。 1.1.4 习题前的数字是什么意思? 每一习题前都有一个由中括号括起来的数字,像下面这样: [2]习题前面方括号中的数字 2 是什么含义? 这个数字是我们关于你大概要花多长时间来解决这道题的(非常粗略的)估计。由于非常粗略,当你在一半或两倍的时间 内完成(书写,调试,测试)时,也不必太惊讶。另外,当被题目难住时,我们也不会告诉任何人你偷看了附录 A。 1.1.5 如果我是 Perl 教师,怎么办呢? 如果你是 Perl 的教师,决定采用本书作为教科书(过去的年月里,许多人采用了它) ,你因当知道我们尽力使每一组联系 能让大多数学生在 45 分钟~1 小时内完成,其间有些休息时间。一些练习可能很快就完成了,另一些也许花的时间要长 些。那是因为,当我们写下了方括号中的数字时,我们发现不知道怎么把它们加起来。 (幸运的是,我们知道怎样用计算 机来做到) 。 blei@163.com 10 / 201 9/21/2006
Slide 11
: Perl 语言入门(第四版) 1.2 Perl 代表什么? Perl 一般被称为“实用报表提取语言” (Practical Extraction and Report Language) ,虽然有时被称做“病态折中垃圾列表器” (Pathologically Eclectic Rubbish Lister)。它是术语,而不仅仅是简写,Perl 的创造者,Larry Wall 提出第一个,但很快又扩 展到第二个。那就是为什么“Perl”没有所有字母都大写。没必要争论那一个正确,Larry 两个都认可。 你也可能看到“perl” ,所有的字母都是小写的。一般, “Perl” ,有大写的 P,是指语言本身,而“perl” ,小写的 p,是指 程序运行的解释器。 1.2.1 Larry 为什么发明 Perl? Larry 在 80 年代中期发明了 Perl 语言,当时他想从像新闻组邮件那样的文件中产生一些有用的报表给一个 bug 报告系统, awk 语言不能胜任这任务。Larry,作为一个懒惰的程序员◆,为了彻底的解决这个问题,决定发明一种一般用途的工具, 至少还能在一个不同的地方使用。这次努力的结果就是 Perl V0。 ◆我们不是无理的说 Larry 很懒惰;实际上懒惰是一种美德。手推车是由那些懒于搬东西的人发明的;文字是由那么懒于记忆的人发明 的。Perl 是由那些不创造一种新的语言就懒于完成任务的人发明的。 1.2.2 为什么 Larry 不采用别的语言? 程序语言本身没有缺陷,有吗?但是,在 Larry 那个时候,他没有找到满足需要的语言。如果现在的某种语言在那个时代 就已产生,很可能 Larry 就会采用它。他需要能像 shell 或 awk 那样快速编码,同时具有如 grep, cut, sort, sed◆等这些高级 工具的强大功能,但又不采用像 C 那样的语言。 ◆如果不知道它们,不用担心。这些是 Larry 的 Unix 工具盒中的程序。但它们还不能解决手头的工作。 Perl 填补了低级语言(如 C,C++,汇编语言)和高级语言(如 shell 编程)的空白。低级语言通常难于编码,并且丑陋, 但速度快,且无限制;高级语言,在速度上,很难超过书写良好的低级语言。在低级语言里,你几乎能完成任何事。高级 语言,正好相反,一般速度慢,困难,丑陋,有限制;如果没有系统提供的函数,shell,批处理语言能完成的工作相当有 限。Perl 简单,几乎是无限制的,速度快,也有些丑陋。 让我们从另一个角度来看关于 Perl 的这四点: 第一,Perl 简单。如你将要见到的,这意味着容易使用。但不是特别容易学习。如果学习开车,你花数周或数月学习,然 后就很容易的开车了。当你花了许多时间来学习 Perl 时,Perl 对你来说就简单了◆。 ◆当然,我们并不希望你翻车()。 Perl 几乎没有限制。几乎没有什么事不能由 Perl 来完成。你一般不希望用 Perl 来书写内核级的中断驱动程序(虽然 Perl 能完成) 。但针对一般工作中遇到的问题,从一次性程序到工业级的运用,Perl 都能出色的完成。 blei@163.com 11 / 201 9/21/2006
Slide 12
: Perl 语言入门(第四版) Perl 速度快。那是由于,所有的 Perl 开发者都使用 Perl,他们希望它快。如果某人想加一个很酷的功能到 Perl 中,但它会 降低其它程序的速度,Larry 基本上会拒绝添加它除非找到一个方法使它足够快。 Perl 有些丑。这是事实。O 'Reilly 给 Perl 的图标是骆驼,这种动物是著名的骆驼书(也被称为 Perl 语言编程)的封面,还 有它的兄弟-本书(它的姐妹,羊驼书(Alpaca)。骆驼有些丑。但是它们努力工作,即便在艰苦的环境中。无论什么困 ) 难骆驼都能完成任务,虽然他们不好看,不好闻,有时还向你吐唾沫。Perl 有些像它。 1.2.3 Perl 容易学习吗? Perl 容易使用,但有些难学。当然,这具有普适性。设计 Perl 时,Larry 做了学多权衡。当遇到能让程序员更容易使用,但 对于初学者难于学习时,Larry 通常倾向于前一种。那是因为,你只学习一次,而将重复使用◆。Perl 有学多做法来节约程 序员的时间。例如学多函数都有默认值;通常,这些默认行为就是你需要的。因此,你将节约学多时间来写像下面这样的 代码◆: ◆如果你每周或每月只花几分钟来使用某种语言。你可能选择那些容易学习的语言,因为在下次使用之前你不需要记住它们。Perl 是给那 些每天至少花 20 分钟来写程序的人。 ◆我们将不详细解释。本例是将文件中某种格式的数据,换成另一种。所有功能都能在本书中均有找到答案。 while(<>){ chomp; print join(“ ,(split /:/))[0,2,1,5]),” ; \n” \n” } 如果不利用 Perl 的默认值和简写,本段代码大约会长 10~12 倍,这将花更多时间来阅读和书写。并且由于有更多的变量, 将难于维护和调试。如果你懂一点 Perl,没有看见代码中的变量,那只是部分问题。它们都使用的默认值。为了减轻程序 员的负担,不得不增加学习的代价,因此你因当学习这些默认值和简写。 一个很好的类比,是英语中的单词。例如,“ not” won’ 含义相同。但大多数人说“won’ will 和“ t” t”而非“will not” ,因为这 将节约时间,并且每个人都知道它们有相同含义。同样的,Perl 也把一些常用的语句以一种更简略的形式来表达,就像语 言那样更快的“说”出来,并且被同行所理解。 一旦熟悉了 Perl,将发现比 shell 引用(或 C 声明)花更少的时间,你将有更多的时间在网上冲浪,因为 Perl 的强大能力。 Perl 设计成能让你仅用数行就能漂亮的解决问题。你可以把这些工具带到下一份工作中,因为 Perl 具有很高的移植性,因 此你将有更多的时间冲浪。 Perl 是高级语言。这意味着,代码很紧凑,通常 Perl 程序大约是它对应的的 C 程序的 1/4 到 3/4 长。这使得 Perl 程序的读, 写,调试,维护速度都更快。当整个程序在一屏中,不需要向上向下滚动查看时,编程将更容易。并且,由于程序中 bugs 的数量大致和它的长度成正比◆(而非和程序的函数) ,这就意味着,平均起来,短一些的 Perl 程序意味着更少的 bugs。 ◆当程序超过一屏时,bugs 数量会突增。 blei@163.com 12 / 201 9/21/2006
Slide 13
: Perl 语言入门(第四版) 1.2.4 Perl 为什么如此流行? Larry 使用了 Perl 一段时间,做了些修补后,把它发给新闻组上的用户了,通常被称为“网上” 。成千上万的用户问他,做 这个那个以及别的许多问题的方法,Larry 从没有预想过他的小 Perl 能处理那些问题。 结果,Perl 持续增长。它的特性越来越多。其移植性越来越强。曾经的一门小语言成长为拥有上千页在线文档,数十本书, 几个主流新闻组(还有大量非主流新闻组) ,每一天几乎每个当代系统上都有无数的读者和实现者。当然,不要忘了这本小 骆驼书。 1.2.5 Perl 正在发生怎样的事情? Larry 最近已经不写代码了, 但他仍然领导着 Perl 的发展, 并作出关键决定。 主要由一群勤劳的被称做 Perl 5 守门人 Perl (Perl 5 Porters)维护。你可以在 perl5-porters@perl.org 中查看他们的工作进展和讨论。 当我们写做此书时(2005 年 3 月),Perl 已经发生了许多变化。在过去的几年中,许多人都忙于下一个主要版本:Perl 6。 不要把你的 Perl 5 扔到一旁,因为它仍是当前最新和最稳定的版本。我们并不期望 Perl 6 的稳定版本会很快出现。当 Perl 6 出现时, Perl 5 也不会消失,几年之内, 许多人将同时使用这两个版本。 Perl 5 的维护者经常把 Perl 6 中的好点子加到了 Perl 5 中。 2000 年,Larry Wall 第一次提出了下一个主要版本是 Perl 社区对 Perl 的重写。自那以后,一个新的解释器“ Parrot” 就进入人 们的视野,但并没影响到普通用户。今年(2005 年) ,唐宗汉(Autrijus Tang)开始利用 Haskell 实现作为轻量级的 Perl 6 的 Pugs(Perl User Golfing System) 来自全球的 Perl 和 Haskell 开发者提供了帮助。 在 http://dev.perl.org/perl6 和 。 http://www.pugscode.org/ 中可以了解到更多信息。 1.2.6 Perl 擅长什么? Perl 擅长写那些需要在短时间内完成的程序。对于那些需要数十个程序员,花费数年的程序,Perl 也能很好的胜任。当然, 更多的情况是你将写那些从开始构思到实际测试代码只需几十分钟的程序。 Perl 被设计为:90%处理文本,10%针对其它情况。这种能力基本上能满足当今的编程任务。在理想情况下,每一个程序员 懂得每一种语言;对于不同的项目将采用最合适的语言。大多数情况,你要选择 Perl◆。当 Larry 发明 Perl 的时候,Tim Berners-Lee 还没有 web 的丝毫想法,但它们是互联上的完美联姻。许多人声称 90 年代初 Perl 的发展使得内容能快速转换 为 HTML 格式在网上传输,而没有内容 Web 是不存在的。当然,Perl 是一种优秀的书写 CGI 脚本(由 web 服务器运行的 程序)的语言,因此许多人如今仍说: “CGI 仅是 Perl 吗?”或者“为什么不说 Perl 而说 CGI?” ,这些论述很有意思。 ◆不要较真。如果想知道 Perl 是否比 X 语言好,那同时学习它们,看那种语言用的最多。这对你是最好的方法。并且,同时学习两种语言, 你将更好的理解它们。花这些时间是值得的。 blei@163.com 13 / 201 9/21/2006
Slide 14
: Perl 语言入门(第四版) 1.2.7 Perl 不擅长什么? Perl 擅长许多事,那么什么是它不擅长的呢?不应当使用 Perl 来产生二进制码。那些程序可以给别人,或卖给别人,而他 们不能看到程序内部的秘密,同时也不能维护和调试代码。当把 Perl 程序给别人时,通常给他们的是源代码而非二进制程 序。 当想要二进制程序时,我们没告诉你不可能。如果人们能安装和运行你的程序,它们也能反编译出来,无论是哪种语言。 当然, 这可能和你最初的源代码不同, 但它们在某种程度上类似。 要保护你的程序, 最好的方法是, 找些律师, 写一份 license: “你可以利用代码做这个,不能做那个。如果违反这个规则,那我们将有律师找你的麻烦,保证让你后悔” 。 1.3 怎样获得 Perl? 你可能已经有了。至少,我们去的地方都装有它。它被移植到许多系统中,系统管理员通常把它安装在每一台机器上。即 便如此,如果系统上还没有安装,你也可以免费获得。 Perl 通过两种许可证(license)发布。对于大多数 Perl 用户而言,任意许可证都足够了。如果想修改 Perl,那你因当仔细的 阅读这些许可证,这里面有对修改代码的一些小的限制。对于不修改 Perl 的用户来讲, “它是完全免费的。 ” 因此,它是免费的,可以在任何具有 C 编译器的机器上运行。下载它,输入几个命令,它就能自动配置和安装。甚至,你 可以让系统管理员帮你完成这些事◆。除了 Unix 和类 Unix 系统之外,人们特别喜欢将它移植到其他系统中,例如 Macintosh◆,VMS, OS/2, MS/DOS, Windows,当你阅读本书时,它可能已经被移植到更多的系统中了◆。在这些新系统中 安装 Perl,一般要比在 Unix 中安装容易。请查看“ CPAN” 中“移植”这一部分以了解更多信息。 如果系统管理员不能安装 Perl,那雇用他有什么用呢?如果你说服他们有困难,去买份 pizza,没有几人能对一份免费的 pizza 说不。 ◆Mac 操作系统中使用的是 MacPerl。如果你有 Mac 操作系统,它是类 Unix 系统,那么你拥有主流的 Perl。 ◆现在还不适合掌上机,因为它太大了。曾有谣言说它能在 WinCE 上运行。 1.3.1 什么 CPAN? CPAN 是全面 Perl 归档网络(Comprehensive Perl Archive Network)的缩写,那是一个值得常去的地方。这里有 Perl 源码, 容易安装到非类 Unix 系统的 Perl◆,例子,文档,Perl 扩展部分,Perl 归档信息等。简言之,CPAN 是全面的。 ◆一般在 Unix 系统中,最好是自己编译 Perl。在别的没有 C 编译器或其它工具的系统中,CPAN 上提高了二进制的 Perl。 CPAN 在全世界有上百个镜像站点。在 http://serach.cpan.org/ 和 http://kobesearch.cpan.org 上可以找到他们。如 果不能上网,你可以从 CD-ROM 或 DVD-ROM 上得到 CPAN 中的部分内容。去附近的技术书店,找一份最近的 CPAN 归 档光盘, 因为 CPAN 每天都在更新。 年以前的文档已经是古董了。 2 最好找一个能上网的朋友, 让它帮你烧录份最新的 CPAN 文档。 blei@163.com 14 / 201 9/21/2006
Slide 15
: Perl 语言入门(第四版) 1.3.2 怎样获得支持? 你有所有的源码,所以得自己修复错误(bugs) 。 听起来不太好,是吧?但是好事情。由于没有对 Perl 源码的限制,任何人都可以修改源码来解决 bugs。事实上,当你发现 并确认一个 bug 时,也许已经有人解决它了。全世界有几千人在维护 Perl。 我们并不是说 Perl 有许多 bugs,但它是程序,每一个程序都至少有一个 bug。为了说明为什么拥有源码会如此有用,想象 你有另一种由一个强大组织,其拥有者是一个光头的亿万富翁所提供的名为 Forehead 的语言, (这仅是一个假设。事实上, 我们知道没有一种语言叫做 Forehead) 。现在想想当你发现 Forehead 中有 bug 时,你能做什么。首先,你报告它。其次, 你期待他们解决它,希望他们尽快解决它,并且下一版要价不要太高。在下一版中,当增加新功能后,不要引入新的 bugs, 希望那个公司不会违反反托拉斯法而导致破产。 对于 Perl,你有源码。如果不幸找到的 bug 没人解决,这基本上是不可能的,你可以雇佣一个和十个程序员来解决它。同 理,如果买了一台新机器,Perl 不能在上面运行,你可以自己移植它。现在,当你需要一个不存在的功能时,你知道该怎 么做了。 1.3.3 有其它的支持吗? 当然。我们最喜欢的是 Perl Mongers。这是由全球的 Perl 用户组组成的。在 http://www.pm.org/ 可以找到更多的信息。可能 你附近的用户组中就有一个专家,或者有人认识某个专家。如果没有这样的组,你可以创建一个。 当然,为了获得帮助,首先,不应该忽略文档。除了 用户手册外◆,也可以从 CPAN : http://www.cpan.org 上找到合适的 文档,当然还有其它站点,如 http://perldoc.perl.org,上面有 Perl 文档的 HTML 和 PDF 版本,http://www.perldoc.org 可以让 你搜寻不同版本的文档,http://faq.perl.org 上有最新版本 perlfaq. ◆用户手册 s 是类 UNIX 系统上的一种文档,如果没有 Unix 系统,Perl 有一份针对你的文件系统的文档。 另一份权威的资料是 O’ Reilly 出版的 Perl 编程语言(Programming Perl),通常被称做“骆驼书” ,因为封面上有骆驼。(本 书被成为 “小骆驼书” 骆驼书中有详尽的参考信息, )。 一些教程, 和大量的关于 Perl 的额外信息。 还有一本由 Johan Vromans (O’ Reilly)编写的 Perl 5 的袖珍书,你可以随时把它带在身边(或放在口袋里) 。 如果想问问题,网上有大量的新闻组和邮件列表◆。每一天的任意时刻,都有某个时区的 Perl 专家在新闻组中回答问题; 在 Perl 帝国里太阳永远都不西沉的。这意味着,你问一个问题,通常数几分钟内就有答案。如果不先查看 FAQ,很快就有 人热情的帮助你。 ◆许多邮件列表可以在 http://lists.perl.org 中得到。 官方的 Perl 新闻组在 comp.lan.perl.*的某些层级上. 当写作本书时,有五个,当它们经常改变。你(或者某个别的负责你们 那里 Perl 的人)应当订阅 comp.lang.perl.anounce,上面有 Perl 的重要通知,特别是关于安全方面的通知。如果需要如何 使用新闻组的帮助,请教附近的专家。 blei@163.com 15 / 201 9/21/2006
Slide 16
: Perl 语言入门(第四版) 有几个著名的讨论 Perl 的 Web 站点。其中最著名的是:Perl Monastery (http://www.perlmonks.org),其中有许多 Perl 书籍的作 者和专栏作家,至少包括本书的两位作者。你可以查看 http://learn.perl.org/ 和它相关的邮件列表 beginners@perl.org. 如果需要付费的帮助,有一些公司乐意为你提供任意数量的收费服务的帮助。当然也有许多免费的服务。 1.3.4 当发现 Perl 中有错误时,该怎么办? 当发现 bug 时,第一件事是再次◆检查文档◆。Perl 有许多特殊性质,和不符规则的地方,你应当确认你发现的是某个特 殊性质还是 bug。检查你的 Perl 是否是老版本;也许你发现的问题在新一些的版本中已经得到了解决。 ◆甚至 Larry 也承认,他经常参考这些文档。 ◆甚至两次或三次。大多数时候,当我们查看文档以得到找到某一异常行为的解释是,通常得到某些别的细微差别的介绍。 当几乎认定发现的是一个真正的 bug 时,问问你周围的人。问问那些工作的,或者附近的 Perl 协会中的人。通常,你发现 的仍是一个特殊性质而非 bug。 当你肯定发现的是 bug,那么准备一个测试案例(test case)。 (你以前没有做过吗?)理想的测试案例是,一段小的的程序, 任何 Perl 用户都能执行它,并且能得到和你一致的结果。准备好一个能反映这个 bug 的测试案例后,应当用 perlbug(Perl 中带有它) 这个工具来报告它。 它会把这个问题用邮件发给 Perl的开发者, 因此在准备好测试案例之前不要随便使用perlbug。 当把 bug 报告出去后,你的事情就完成了,通常能在几分钟内得到回应。一般,你会得到一块小的补丁,然后你的 Perl 就 能恢复正常。当然,你也可能得不到任何回答,因为 Perl 的开发者没有义务来阅读这些 bug 报告。但我们都热爱 Perl,我 们不希望 Perl 中有任何错误从我们的眼皮底下溜走。 1.4 怎样才能写一个 Perl 程序? 是时候问这个问题了(也许你还没有呢) 。Perl 程序是文本类型的;可以用你最喜欢的文本编辑器来创建它们(你并不需要 任何特别的开发环境,虽然有一些商业公司提供。我们对于这些工具都使用不多,所以不够资格推荐它们。 ) 应当使用程序员的文本编辑器(programmer’ text editor),而不是普通的编辑器。它们有什么不同点呢?一般,程序员的编 s 辑器能提供一个程序员所需要的功能,例如缩进,或非缩进一块代码,能匹配对应的花括号等。在 Unix 系统中两个最流行 的程序员编辑器是 emacs 和 vi(以及它们的克隆和变种) 。BBEdit 和 Alpha 是 Mac 系统中两个优秀的编辑器。在 Windows 平台上,口碑很好的编辑器是 UltraEdit 和 PFE(程序员喜欢的编辑器(Programmer’ Favorite Editor,))。Perlfaq2 上列有几个 s 其它的编辑器。询问你当地的专家,让他推荐你机器上的编辑器。 对于本书的练习题而言,其代码长度都在 20 或 30 行之内,任意编辑器都能胜任。 少数的初学者使用字处理软件而非文本编辑器。我们不同意这样做,因为它们不仅不方便,同时很可能带来错误。但我们 不阻止你。当你这样做,在保存时,请把文件保存为仅文本类型的(text only),字处理软件有它自己的格式,这些东西通常 是无用的。许多字处理软件很可能提醒你 Perl 程序拼写错误,应当使用更少的分号等等。 blei@163.com 16 / 201 9/21/2006
Slide 17
: Perl 语言入门(第四版) 某些情况下,你可能在一台机器上书写程序,然后在另一台机器上运行。如果需要这样做,确定传输文件时选的是“文本” (text)模式或“ ASCII” 模式而非“二进制” (binary)模式。选择这种方法的原因是,不同机器有不同的文本格式。如果不 这样做,可能得到不一致的结果。某些版本的 Perl,当检测到行结束符不对时,会中断执行。 1.4.1 一个简单的例子 依据传统,关于计算机语言的书籍,应当以“ Hello,world” 这个程序开始。下面是其 Perl 版本: #! /usr/bin/perl print “ Hello,word!\n” ; 我们假设你已经把它输入到文本编辑器中。 (别担心这个程序的含义以及它如何执行。你将很快知道) 。可以将它以你喜欢 的任何名字命名。Perl 不需要任何特别的文件名字或后缀名,但最好不要使用后缀名◆。有些系统中需要像.plx(PerL eXecutable,可执行的 Perl)这样的后缀;可以查看系统上的 release notes 来获得这些信息。 ◆为什么最好不要后缀呢?想象写了个给保龄球记分的程序,你告诉所有的饿朋友它被称为 bowling.plx。某一天,你决定用 C 重新写它。 你应该仍以相同的名字命名,表示它仍用 Perl 写成?还是告诉他们,它有了个新名字?(噢,请不要把它叫做 bowling.c) 。事实上,他 们不关心你用什么语言写它,他们只管用。因此,如果当初把它命名为 bowling,你将少许多麻烦事。 也许需要做些事情,让你的系统知道它是可执行程序。需要做什么呢,视你的系统而定。也许你只需把它放在某个特定的 路径就行了。 (通常你的当前目录就行了) 。在 Unix 系统中,你需要用 chmod 命令将程序变成可执行的,可能像下面: $ chmod a+x my_program 行首的美圆符号($) (和空格)是 shell 提示符,可能你的系统上有些不同。也可在 chmod 后使用 755 来代替 a+x 。两种 方法都是告诉系统这个文件是一个程序(可执行的) 。 现在你可以如下运行它: $ ./my_program 命令开始的点和斜线表示在当前路径查找程序。事实上并非在所有情况下都需要,在完全理解它之前,你应当每次都使用 它◆。如果运行顺利,这看起来像奇迹。通常,你会发现程序有错误。编辑,再试一次,当然不需要每次都使用 chmod 命 令,因为这个文件的权限已经被修改过了。 (当然,如果没有正确的使用 chomd 命令,你可能在 shell 中得到不允许操作 “permission denied”这样的信息) 。 ◆简言之,它防止你运行另一个相同名字的程序(shell 内嵌的) 。新手的一个普遍错误是把它命名为 test,而许多系统都有这样的程序(shell 内嵌的)。这就是新手运行的为什么不是他们自己程序的原因。 blei@163.com 17 / 201 9/21/2006
Slide 18
: Perl 语言入门(第四版) 1.4.2 这个程序有些什么? 同任意自由格式语言一样,Perl 通常允许使用任意数量的空白(如空格,制表符,换行符)来使程序易于阅读。但大多数 Perl 程序使用一种标准格式,非常像刚才展示的程序。我们强烈的鼓励你使用缩进格式的程序,使你的程序更易阅读;一个好 的文本编辑器能代你完成许多事情。 好的注释能让程序易于理解。在 Perl 中, 注释由#开始,直到本行结束 (Perl 中没有“块 注释” (block comments) )◆。在本书的程序中我们没有使用大量的注释,因为正文中已经解释了它们,而你自己的程序, 应当使用注释。 ◆但是有许多伪造的方法。查看 FAQ(在许多情况下,可以用 perldoc perlfaq 来查看) 因此,另一种(看起来,有些奇怪)写“ Hello,world” 的方法是: #! /usr/bin/perl print #这是注释 “ Hello, world!\n” ; #不要这样写代码 第一行是特殊的注释。在 Unix 系统中◆,如果文本的第一行前两个字符是“ ,接着的就是执行下面文件的程序。在本例 #!” 中,这个程序是/usr/bin/perl。 #!行和程序的可移植性相关,需要找到每台机器的存放地点。 幸运的是,通常都被放在/usr/bin/perl 或/usr/local/bin/perl 中。 如果不是这样,则需要找到你自己机器上 perl 的存放地点,然后使用那个路径。在 Unix 系统中,可能使用如下一行找到 perl: #! /usr/bin/env perl 如果 Perl 存放的路径不在你的搜索路径上,应当询问你的系统管理员或者某一个和你使用同一台机器的人。 在非 Unix 系统中,传统上把第一行写做 #!perl。至少,它立刻告诉程序的维护者,这是一个 Perl 程序。如果#!行错了,通 常会在 shell 中得到一些错误信息。通常是一些意想不到的信息,如文件不存在“file not found” 。这不是说没有找到你的文 件;而是说 perl 没有在/usr/bin/perl 那里(其恰当的地方) 。我们应当时这条消息更清晰,但它不是 Perl 而是 shell 给的。 (顺 便提醒下,不要把 usr 写成 user,因为发明 Unix 的伙计懒于书写,因此省略了许多字符) 。 另一个问题是,你的系统可能根本不支持#! 。如果这样,你的 shell(或者别的) ,可能要自己执行你程序,得到一些让人吃 惊的结果。如果不知道这些错误信息,你可以查看 perldiag 的用户手册。 “ main” 程序包含了所有 Perl 语句(不包括子程序,你在后面会看到) 。和 C 或 Java 不一样,Perl 中没有“ main” 程序。 和其它语言不同,Perl 中不需要声明变量。如果其它语言中你必须申明变量,这可能让你惊奇。但它让我们快速写出 Perl 程序。如果程序只有两行,不希望其中一行仅仅是申明变量。如果你想声明变量,这是好事;第四章有详细说明。 许多语句,由表达式后接分号组成。下面是你已经看了几次的语句: blei@163.com 18 / 201 9/21/2006
Slide 19
: Perl 语言入门(第四版) print “ Hello,world!\n” ; 你可能猜想,这行将打印出 Hello,world! 。结尾是\n,如果使用过 C,C++,Java,你可能知道它是换行。当打印出这条信 息后,换行,shell 提示符出现在新行上,而不是在上一条信息之后。单行的输出应当以换行符结束。下一章我们将学习更 多的关于换行符,和其它由反斜线(\)转义的符号。 1.4.3 怎样编译 Perl? 只需要运行你的 Perl 程序。Perl 的解释器将编译和运行你的程序。 $ perl my_grogram 当运行程序时,Perl 的内部编译器首先遍历整个源程序,把它转变为内部的字节码,它是程序的一种内部数据结构。Perl 的字节码引擎将运行这些字节码。如果 200 行有一个语法错误,在执行程序的第二行◆,你将得到出错信息。如果某个循 环运行 5000 次,它将一次编译;循环将以最快的速度运行。程序的注释不会增加程序的运行开支。如果某个表达式的计算 结果是一个常数,那在程序开始运行时,就会以这个常数来替换,而不需每次循环重新计算。 一个可能的例外情形是,当写了一个 CGI 脚本,它可能每分钟被调用成百上千次。 (这个使用率很高。如果一天被调用百 次,千次,我们并不担心) 。许多此类程序都只有很短的运行时间,因此重新调入他们将是笔可观的开支。如果这对你是个 严重的问题,你希望找一种方法能让你的程序保持在内存之中。有一个关于 Apache web server (http://perl.apache.org )的模 块:CGI::Fast 兴许能帮助你。 可以保存这些编译过后的字节码以减轻编译的负担吗?或者,更好的是,可以把这些字节码转换为别的语言,如 C,然后 编译他们?这两件事,在某种程度上都是可行的,但它们可能使程序难于使用,维护,调试和安装,也可能让你的程序运 行更慢。Perl 6 在这方面有重大改进,但现在讨论还为时过早(当我们写做此书时) 。 1.5 快速了解 Perl 想看一个有些意思的 Perl 程序吗(如果不想,那随便看看)? 如下就是一个: #! /usr/bin/perl @lines= `perldoc – – atan2`; uf foreach(@lines){ s/\w<([^>]+)/\U$1/g; print; } 当第一次看见这样的 Perl 代码时,你可能觉得很奇怪。 (事实上,每次你看到这样的 Perl 代码时,都觉得它们奇怪) 。让我 们一行一行的来学习它, 看看这个例子完成了什么样的任务。 (这些解释很简洁;这里只是大致的讲解。 在本书的剩下章节, 我们将更加详细的讨论它们。现在并不假定你完全理解它,那是以后的事情。 ) 第一行是#!这一行,我们已经见过了。你也许要修改它,我们已经讨论过了。 第二行运行了一个外部命令,由` `括起来了。 (反引号 ` 通常在美式键盘数字 1 的左边。不要和单引号 ‘混淆了。 )我们用 blei@163.com 19 / 201 9/21/2006
Slide 20
: Perl 语言入门(第四版) 的命令的是 perldoc – – atan2;在命令行输入这个命令,看看能得到什么结果。perldoc 这个命令能在大多数机器中使用, uf 它显示相关的文档◆。这个命令告诉你一些关于反正切函数 atan2 的信息;在这里我们把它做为一个外部命令,并处理它 的输出信息。 ◆如果 perldoc 不能使用。那可能是因为你的系统没有命令行接口,你的 Perl 不能通过反引号或 piped-open(请查看 chapter14)来运行命 令(如 perldoc) 。如果是这样的,应当跳过需要利用 perldoc 的练习。 反引号内的命令的输出被保存在@lines 中。下一行是一个循环,它依行处理@lines 中的信息。循环内语句是缩进的。虽然 Perl 并不需要这样,当这是好的编程习惯。 循环内的第一行让人惊慌;它是 s/\w<([^>]+)>/\U$1\g;这里不过多的讨论细节,我们只提示下,它能改变有特殊标记(<>) 的行,在每一 perldoc 这个命令的输出中,都至少有一行具有这样的形式。 下一行,令人惊奇的是,它输出每一行(可能是修改过的) 。输出的结果和 perldoc – – atan2 类似,但标记(<>)内的内 uf 容有些不同。 总结下,通过这几行程序,我们运行了另一个程序,把它的输出保存在内存中,修改内存中的数据,再把结果输出来。这 种把数据从一种形式转换成另一种形式的程序在 Perl 中很常见。 1.6 第六节 练习 通常,每一章都会由一些练习来结束,答案在附录 A 中。但是不需要完成这些练习来结束本章的学习,它们只是正文的补 充。 如果不能在机器上练习这些习题,询问你附近的专家。记住应当仔细的推敲这些习题。 1. [7]输入“ Hello,world” 这个程序,让它运行起来。 (你可以任意命名,但像 ex1_1 这样的名字就显得好些,它表示第一章 第一个练习。 ) [5]在命令行输入 perldoc – – atan2 这个命令,注意它的输出。如果命令无效,询问你的管理员或者从文档(这个版 uf 本的 Perl 文档)中查看调用 perldoc 或其等价的方法。 (你需要做这些来完成下一个练习) [6]运行第二个例子(前一节中) ,观察它的输出。 (提示:注意正确输入这些标点符号) 。注意到和第二题输出的不同 地方了吗? 2. 3. blei@163.com 20 / 201 9/21/2006
Slide 21
: Perl 语言入门(第四版) 第二章 标量数据 在英语以及许多其它的语言中,需要区别单数和复数。作为一门由语言学家发明的语言,Perl 也是类似的。同一般情况一 样,Perl 也有数据类型—标量◆。标量是 Perl 中最简单的数据类型。大多数的标量是数字(如 255 或 3.25e20)或者字符串 (如 hello◆或者盖茨堡地址) 。你也许把数字和字符串看作不同的事物,但 Perl 几乎以相同的观点来看待它们。 ◆这个概念和数学或者物理学中的标量(一个单独的是事物)没有多少关系;Perl 中也没有向量。 ◆如果使用过别的编程语言,你可能把 hello 看作 5 个字符的组合,而不是一个单独的东西。但在 Perl 中,一个字符串是一个标量数据。 当然,可以使用这个字符串内部的值,你将在后面章节中了解到怎么做。 标量数据可有操作符(如相加和串联) ,通常会产生一个新的标量数据。标量数据的值可以存放在标量变量中。标量可以从 文件或设备读取,也可以写进去。 2.1 数字 虽然标量在大多数情况下不是数字就是字符串,现在我们最好还是将它们分开来看待。我们首先讨论数字,再讨论字符串。 2.1.1 所有数字内部的格式一致 在下面几段中,你将看到整数(如 255,2001 等)和浮点数(有小数点的实数,