Perl 语言和系统管理——洪峰老师讲创客道(二十七)

Posted Linux内核之旅

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Perl 语言和系统管理——洪峰老师讲创客道(二十七)相关的知识,希望对你有一定的参考价值。

Perl语言是语言学家Larry Wall的发明,他推荐过黑客应该学习的五种语言,Perl语言的全称是Practical Extraction and Report Language,意思是实用的摘录和报告语言。在社团里也有人调侃他是Pathological Eccentric Rubbish Lister(病态的、行为古怪的垃圾陈列器)这么一个说法。Perl语言名称的来源可知它有两个功能是非常突出的,一个是从文本数据中摘取所需数据,;另一个是把数据以某种格式制作一个报告返回出来,这两种功能在Perl语言里面非常强大。这两个特点与它诞生的历史背景有关系。Larry Wall当时在发明Perl语言时,他试图用AWK脚本语言去做一个类似于News Net新闻的文件系统中一些错误、记录系统的报告,但他发现AWK不能够去完成,他决定另起炉灶,开发了另外一种语言,后来就叫Perl语言。他开发了Perl的原型后,就发布到News Net上去,当时与Larry Wall面临相似问题的人有很多。一下子他在系统管理员方面找到了知音,他们后来组成了一个团队。这也是Perl被广泛用于Unix系统管理的原因。从语言的诞生背景来说这个语言的基因就是为Unix系统管理员而设计的,今天在FreeBSD和各种的GNU LinuxPerl语言都是内置的工具,利用Perl语言进行Unix系统管理,仍然Perl最主要的应用之一。

但什么又叫系统管理员呢,系统管理员的工作概括起来包括以下内容:1)在Unix系统上增加一个新的用户账号;2)如果有一群用户共享Unix服务器,而服务器上提供了打印机或者是绘图仪的话,系统管理员需要做为打印机添加墨粉或者墨水、增加纸张之类的工作3)做系统上的数据备份;4一旦用户偶然删除了数据,帮助用户恢复删除的数据;5)回答用户所提出的技术问题,并帮助用户使用计算机系统;6)密切监控系统行为,仔细调整系统各种参数设置,让繁忙的系统能有空闲时间对用户的使用需求作出响应;7)对打印队列进行管理,是所请求打印的用户得到良好的服务;8)高度关注系统安全性,修复漏洞;9)对操作系统进行升级;10定期或者不定期整理碎片,释放一些磁盘空间;11) 当系统崩溃时,要进行启机;12)用户局域网出现新需求是,要解决布线、连网、增加网卡和网线等;13)当用户增加新设备时,将设备安放在适当位置,让设备高效安全的发挥作用;14)找出系统发生异常的原因并修复;15)当Unix用户使用应用程序出问题,要知道应用程序的用法,帮助用户解决;16)要经常开会,内部会议或者外部会议17)关于连网,把自己的Unix网络和互联网服务提供商(Internet Service Provider)提供的接口连接起来;18系统管理员要编写一些脚本语言,尽最大努力把前17条进行自动化处理。

关于Perl语言的介绍,O'Reilly 公司出的书是最多的 ,也是最有名的。曾经在19944月份,O'Reilly 公司和加州伯克利大学的计算机系统研究小组合作,把USENIX这个组织发布的4.4BSD系统的文档做了整理,出版成五卷的内容,这五卷的内容分别是:14.4BSD User`s Refers Manu(用户使用指南)24.4BSD User`s Supplementary Documents (第一卷补充)34.4BSD System Manager Manu(系统管理员手册) 4) 4.4 BSD Programers Refers Manu 程序员参考手册)54.4 BSD Programers Supplementary Documents(程序员补充文档)。除了这五卷手册以外,O'Reilly 公司和USENIX协会合作出版了一本叫《4.4 BSD Lite Cd-Rom Company》,这也是FreeBSD的前身.4.4BSD Lite这个代码机上出现了FreeBSDNetBSDOpenBSD等多个分支,FreeBSD是其中影响最大的一个分支。在我刚才提到的五卷中的第三卷——《系统管理员的手册》,它一共收录了很多文章,其中最后一节就是讲Perl编程语言的,这也是我第一次详细看Perl的细节。从文章里面,作者Larry WallPerl语言做了一个非常清晰、非常简要的说明,在Perl语言流行的过程中,Larry Wall还写了很多书,O'Reilly 公司还组织人力物力出版关于Perl 语言的一系列图书,这些书都成为Perl社团积极成长的很重要因素。

我在90年代与O'Reilly 合作的时候,曾经把O'Reilly 公司的一本《Learning Perl 》(第二版)从英文翻译成了中文,在中国开始推广Perl语言。

说了这么多,Perl究竟有哪些特点呢,我会与前面提到的Shell相比首先,Perl提供了丰富的内置的数组结构,Perl语言中标量数据根Shell变量基本上是一样的。在Perl中标量符号是以$打头的,比如说fred这个变量名,如果表示成$fred就表示一个标量,标量的表示用字符串或者是数字都可以。Perl提供了数组,实际上就是我们在Lisp里面讲的list(列表)。Perl数组可以存放不同类型的数据而且数组元素与元素之间是逗号隔开,这点与Lisplist有些不一样。Perl还提供了哈希(hash)数组,即关联数组Lisp中的PlistAlistPerl语言中也是内置的Perl也提供了句柄,有文件句柄和目录句柄,句柄的概念类似于Scheme 语言或者Racket语言中的 port的概念,可通过句柄进行输入输出操作。刚才说过数组在Perl语言中是以@打头的,@fred表示一个数组。而关联数组或者是哈希是以%打头的,比如说%fred表示一个关联数组。除此之外Perl还有一些其他的约定,比如说@fred就表示对fred这个函数的调用,*fred表示 type global,相当于C++的泛型或者是Lisp的符号。还有/*fred表示一个引用,引用和C语言里面的指针用法颇为相似,不同的是Perl的引用不能被用来分配或者管理内存。

一旦明白了Perl语言的内置的数据结构和约定后,那么学习Perl语言的控制的结构,这个不是难点。从某种意义上讲,Perl语言是比较容易的。可是Perl为什么有难读的名称,因为它内置有大量约定。大家回忆一下,前面我们讲Shell语言的时候,Shell语言是不是有大量的内部约定呢?Perl除了继承大部分Shell的变量和约定之外,自身还增加了一些约定,比如在定义Perl的函数的时候,把形参表当成数组来看待,数组的写法是@uderscore 来表达的,怪异的是形参表并不出现在Perl函数的声明中,但在函数体内部可以使用一些标量@underscore[0]这个方式来引用第一个参数。与学习Shell编程一样,熟悉这些Perl的约定要花费大量的时间有一个比较长的学习曲线。当然了,如果你已经知道Shell编程的话,这些概念学习起来是非常简单和直观的。事情总是一分为二的,Perl中的内置函数和变量是有学习曲线的,但是一旦掌握这些之后,使用Perl编程会更高效,这是他的一个利益所在,这也是许多系统管理员把Perl当成黑客工具箱的一个宝贝工具之一的原因。

当理解了这些基本概念以后,就可以开始看看Perl是如何完成它的摘要与报告中的第一个功能,就是摘要的功能。摘要就是首先要扫描文本,在文本中提取所需的数据,这正则表达式的应用就十分关键Perl语言之所以强大无比,一个很关键的原因就是他的正则表达式的功能非常强大。一旦学习了Perl语言的基本概念以后,就要花很多时间去研究正则表达式的用法。我前面说Racket语言的时候说过,在乔姆斯基的语言分类里面,三形语言也就是正则语言,它的基础就是正则表达式。从这一点上说,Perl语言在正则表达式的设计上做到了强化与简化,抓住了问题的关键。正则表达式的学习与使用是Perl编程的十分重要的基础,总体来看正则表达式用途可概括为一句话:用于匹配、替换和转换。

Perl的正则表达式是非常强大的,这里举一个例子,它可以匹配任意类型的ASCLL数据;它可以处理任意长度的数据;它的表达式的长度可以是64KB在数据模式上可以记住最后一次匹配的地方,可以看出它有回溯的机制还可以处理数据的交际模式还可以匹配字母的类别,比如大小写,数字,二进制字符等等还可以执行否定查询处理贪婪的匹配也可以生成词法扫描

在早期Unix有两个工具,一个叫做Lex,是词法分析器,一个叫做Yacc,是语法分析器Perl语言可以很好地做词法分析。有了这么多的功能以后,可以看出Perl语言的正则表达式是很强大的很少有强大的工具是容易学习的,这句话同样使用Perl语言的正则表达式。

在这里我会把Perl语言的正则表达式归纳为八条,掌握了这八条后,Perl的正则表达式的使用就比较容易了。这八条分别是:1我前面提到了,正则表达式有三种不同的形式,分别用于匹配、替换和转换;2正则表达式仅对标量进行匹配;3正则表达式匹配于给定匹配模式最早的可能匹配;4正则表达式能够处理双引号做能处理的任意后全部字符;5正则表达式在求值过程中产生两种情况,分别是结果状态和反向引用;6)正则表达式的能力核心在于通配符和多重运算操作符以及它们如何操作;7)如果匹配不止一个字符集合,那么Perl使用叫做替换的技术;8Perl用“ ?...” 为正则表达式提供了扩展名。掌握了这八点后,无论Perl的正则表达式有多复杂,都可以应用自如。掌握了正则表达式后,Perl语言的摘录功能就有了理解。

那么现在来看看Perl语言的第二个功能,即报告功能,来谈谈该部分是如何实现的。在报告那部分,Perl可以生成一个格式(Format(在Perl脚本里面定义)的模板在这个模板里可以定义自己的表格,在哪些地方有固定的数据出现,需要填什么数据到这个表格,所以表格(table)的定义,是Perl语言报告的核心。在互联网Web发展的早期,Perl被大量应用于CJI的设计CJI的设计中,Perl的摘录与报告的功能得到了充分体现。因为首先要对用户的请求作出解析,发现用户提的什么问题,然后在做出响应的时候生成一个新的网页,在这个网页里就有一些模板,比如有,还有新生成的数据要填进去在所有模板填好之后,作为一个响应从服务器返回客户机,显示在用户的浏览器上面。所以早期的Perl为什么广泛应用在CJI呢,因为这个要求与Perl语言的功能是完全吻合的。

 


以上是关于Perl 语言和系统管理——洪峰老师讲创客道(二十七)的主要内容,如果未能解决你的问题,请参考以下文章

函数的概念Lambda 演算与 Haskell 语言——洪峰老师讲创客道(三十二)

Haskell语言的其他特性——洪峰老师讲创客道(三十六)

范畴和函子,以及它们在 Haskell 中的应用——洪峰老师讲创客道(三十四)

Haskell 中的单子——洪峰老师讲创客道(三十五)

科学发展的四范式,函数式编程语言的兴起——洪峰老师讲创客道(三十一)

2019北京人工智能(创客教育)展览会-扬帆起航