perl与pythonn有像perl那样的变量内插功能吗

个人出版图书:《玩转perl与pythonn网络爬蟲》、《玩转Django2.0》


首先从这个栗子我们可以学习Inline::perl与pythonn的程序布局:一个典型的用法是把perl与pythonn代码以

这样的Perl多行字符串的形式包裹当然包裹perl与pythonn代碼的方法还有很多种,详见Inline::perl与pythonn的文档

然而不幸的是,这个栗子是行不通的我们继续往下看。

这段代码可以正常运行在perl与pythonn区块中定义嘚函数在Perl中可见。最为关心的是参数传递问题逐条分析:

#[3] 函数支持多个参数。

#[4] Perl 传入ARRAY值(即@)类型perl与pythonn会理解为多个参数。由于在Perl中HASH值類型(即%)实际上是一种特殊的ARRAY,perl与pythonn的处理方式应相同

有时候需要向perl与pythonn传递“函数指针”以实现回调。Inline::perl与pythonn已经照顾到了这种需求:

Inline::perl与pythonn为函数引用建立了一个类型_perl_sub在perl与pythonn中,这个类型的值可以当成函数对象来使用

能再复杂一点么?找个对象怎么样

作为面向对象的语言,perl與pythonn中很多功能都是以提供类的方式实现的

这个例子说明,如果在perl与pythonn区块中定义了类Bar那么在Perl环境中就相当于有了一个package Bar。Inline::perl与pythonn会自动提供一個构造函数new

说到这里基本的问题差不多都解决了。小伙伴们可以利用Inline::perl与pythonn足不出户,在Perl中就可以调用各种稀奇古怪的第三方perl与pythonn库了

能鈈能再复杂点,都OO了……

2) 用SUPER保留字访问父对象别忘了和类名bless在一起。

}

To Do It(不只一种方法來做这件事 ),即「 Tim Toady 」作为一种“胶水型”语言,它具有强大的正则表达式和模式匹配功能以及灵活的数据结构如动态数组、Hash 等,在语法规则上借鉴叻 C/C++、Basic、Pascal 等语言其不足之处在于存在一些冗余语法,代码的可读性较差

perl与pythonn 是一种基于面向对象的解析性交互式的开源编程语言,它起源於 1989 年末由 CWI(阿姆斯特丹国家数学和计算机科学研究所)的研究员 Guido van Rossum 创立1991 年初公开发行,其开源式的发行方式促进了 perl与pythonn 的较快发展目前已經形成了一个强大的社区力量。perl与pythonn 开发者的哲学是“用一种方法最好是只有一种方法来做一件事”。perl与pythonn 具有简单易学、代码规范、语法簡单、可移植性强、支持多平台、类库丰富等优点
Perl 和 perl与pythonn 都是开源的,但其哲学理念却刚好相反因此常被人们将这两种语言放在一起进荇比较。下面的篇章将从基本数据类型、控制流、函数、面向对象、文本处理等方面对这两种语言进行简单的比较和鉴别

脚本语言支持哆种数据类型,变量无需事先申明类型根据值来动态确定,一个变量在程序中可以根据上下文环境的不同存储不同类型的值

Perl 支持的基夲数据类型包括:标量、数组、哈希。在定义的时分别用 $、@、% 表示

  1. 标量 (scalar):标量是 Perl 中最简单的数据类型,大多数标量由数字或字符串组成其中数字类型如整数、浮点数等,字符串有单引号和双引号内两种形式对长度没有限制。两者的区别在于在单引号内 \n 不代表换行而玳表反斜线和 n 这两个字符,双引号内字符串则可以通过反斜线进行转义字符串的操作符有 . 拼接操作符和 x 重复操作符等。

perl与pythonn 支持五种基本數据类型:数字 (Numbers)、字符串 (String)、列表 (List)、元组 (Tuple) 和字典 (Dictionary)其中数字和字符串和 perl 中的标量对应,列表和数组对应元组可以看做是不可变的列表,字典和 hash 对应

  1. 字符串 (String):perl与pythonn 与 Perl 一样也支持单引号和双引号字符串,但与 Perl 不同转义字符在单引号中也会起作用。同时 perl与pythonn 还支持三引号字符串咜允许一个字符串跨多行,字符串中可以包含换行符制表符以及其他特殊字符。三引号字符串常用于注释或者形成文档字符串支持成員操作符 in,not in连接操作符 + 以及重复操作符 *。perl与pythonn
  2. 元组 (Tuple):元组和列表非常相似但用()表示,并且元组是不可变的
  3. 字典 (Dictionary)字典跟 Perl 中的 hash 一样,定义了键值对之间一对一的关系变量可以任意取名,perl与pythonn 会在内部记录其数据类型定义一个字典:D={“name”:”Jon”,”Family”:”SH”}, 字典中的 key 是不能偅复的,并且大小写敏感同时字典中的元素是无序的。字典也支持增删操作往字典中添加元素

在控制结果方面,Perl 较 perl与pythonn 丰富除了支持傳统的 if 、while 、for 控制结构,还支持 until 、unless 、foreach 等perl与pythonn 的控制结构相对要少一些,但已经能够满足语言的要求本节对这些控制结构进行详细比较。

Perl 中還支持 unless 条件控制语句基本语法如下:

unless 和 if 不同之处在于当条件表达式的值为假的时候才执行,同时 unless 后面还能跟 else 语句如:

perl与pythonn 不支持传统的 for 循环,但是提供了强大的循环结构可以遍历序列成员同时 for 循环后面也可以接 else 语句,基本语法如下:

  1. last:立即终止循环类似于 c 中的 break。在多層循环中只对 last 所在的当前循环块有效;
  2. next:立刻结束当前这次迭代;
  3. redo:将控制返回本循环的顶端,不经过条件测试也不会进去下一次迭代循环而是重新执行本循环块。它与 next 最大的区别在于 next 会正常继续下一次迭代而 redo 会重新执行本次迭代。
  1. continue:continue 语句并不会退出循环结构而是竝即结束本次循环,重新开始下一轮循环也就是说,跳过循环体中在 continue 语句之后的所有语句继续下一轮循环;
  2. pass:一般作为占位符或者创建占位程序,pass 语句不会执行任何操作

Perl 和 perl与pythonn 都支持函数,可以传递参数以及在程序中对函数进行调用等下面从函数的定义,调用返回徝以及参数传递等方面对这两者进行比较。

使用 return 语句显示返回;如果没有 return默认返回最后一次运算的结果 使用 return 语句显示返回,没有 return 语句默认返回为 None。如果函数返回多个对象perl与pythonn 把他们聚集起来并以一个元组返回。
  1. 直接采用 函数名(参数 1参数 2.....)
  1. 在子程序调用的后面加上被括号圈引的列表表达式即可,所有的参数都会自动存储为 @_ 中其中第一个参数为 $_[0], 第二个参数存储 $_[1]。
  2. 传递引用在参数前加入 \ 表示为引用
  1. 按照参数声明的关键字顺序直接传递;
  2. > perl与pythonn 在传递参数的时候支持默认参数,规则是所有的位置参数必须出现在任何一个默认参数之前如
    一種方法是利用非关键字可变长参数 , 可变长的参数元组必须在位置和默认参数之后 , 带元组的函数语法如下:
    其中 * 之后的形参将作为元组传递給函数。

    另外一种方法是利用关键字变量参数区别是在函数的参数变量里使用 **。

Perl 程序把变量和子程序的名称存贮到符号表中Perl 的符号表Φ名字的集合就称为 Perl 包 (package)。定义语法为:package mypack;每个符号表有其自己的一组变量、子程序名各组名字是不相关的,因此可以在不同的 Perl 包中使用楿同的变量名而代表的是不同的变量。Perl 模块有两种来源一种是随 Perl 发行版本一同打包的,另外就是用 CPAN 中下载的Perl 模块和包的概念并不清晰,两者有时可以混用在程序中使用模块的操作称为导入模块;导入模块关键字 use;如:use ModuleName;模块被导入后,其中的子程序和变量就可以直接使用了;要取消一个已经导入了的模块可以使用关键字 no;如:no ModuleName。

这个模块里的所有标识但是这些标识现在都在 module 名字空间下。from module import * 也会导叺 module 中所有标识但是标识放到在当前名字空间里。

导入模块或包按下面顺序进行路径查找:

在 Perl 中类是 Perl 包,含有提供对象方法的类而方法是 Perl 的子程序,类名是其第一个参数对象是对类中数据项的引用。在 Perl 中创建一个新类首先要创建一个包,扩展名为 .pm, 在创建 perl 包的时候程序的最后一个必须为"1;";否则该包不会被 Perl 处理

其中 new() 方法是对象的构造函数,是创建该类的对象实例必须被调用的它返回该对象的引用。將类名与引用相结合称为”bless”一个对象其语法为:bless YeReference [,classname]

YeReference 是对被”祝福”的对象的引用,classname 是可选项指定对象获取方法的包名,其缺省值为当湔包名也可以通过函数 bless 来声明一个构造函数。

Perl 类中的方法就 Perl 的子函数规定第一个参数为对象或者被引用的包,分为静态方法和虚方法 虚方法通常首先把第一个参数 shift 到变量 self 或 this 中,然后将该值作普通的引用使用一是通过该对象的引用 ( 虚方法 ),一是直接使用类名 ( 静态方法 )如上例中如果类 Person 中有 getContactList 则可以直接使用

由于 Perl 采用了简单的、基于引用的垃圾回收系统。Perl 跟踪对象的链接数目当某对象的最后一个应用释放到内存池时,该对象就自动销毁因此一般不需要定义类的析构函数。

当子类继承父类的时候继承了父类的所有方法,但子类也可以覆盖父类的方法如加入 Employee 想覆盖父类的 getFirstName:

在 perl与pythonn 中创建一个类的基本语法为 :

参数 base 可以是一个单继承或者多继承的父类,object 是所有类的父类位於类继承结构的最上层。类的构造函数为 __init__()其中构造函数中 self 会作为第一个默认的参数。而类的析构函数则是 __del__()访问类的方法和属性可以直接使用 . 访问符。

perl与pythonn 不仅仅支持单继承和多继承同时还支持方法的覆盖 .

perl与pythonn 类和实例支持一些内建函数,如

匹配除换行符以外的所有字符
匹配 0 次或一次 x 字符串
匹配 0 次或多次 x 字符串但匹配可能的最少次数
匹配 1 次或多次 x 字符串,但匹配可能的最少次数
匹配 0 次或一次的任何字符
匹配 1 次或多次的任何字符
匹配刚好是 m 个 的指定字符串
匹配在 m 个 以上 n 个 以下 的指定字符串
匹配 m 个 以上 的指定字符串
匹配符合 [] 内的字符
匹配不符匼 [] 内的字符
匹配一个数字的字符和 [0-9] 语法一样
英文字母或数字的字符串,和 [a-zA-Z0-9] 语法一样
非英文字母或数字的字符串和 [^a-zA-Z0-9] 语法一样
匹配以英文芓母 , 数字为边界的字符串
匹配不以英文字母 , 数值为边界的字符串
匹配符合 a 字符 或是 b 字符 或是 c 字符 的字符串
这个符号会记住所找寻到的字符串,是一个很实用的语法第一个 () 内所找到的字符串变成 $1 这个变量或是 \1 变量,第二个 () 内所找到的字符串变成 $2 这个变量或是 \2 变量以此类推丅去。 b(\d)c 表示匹配的任何数字将存放与 $1 变量中


perl与pythonn 语言本身不支持正则表达式依赖 re 模块(perl与pythonn1.5 版本被引入)支持正则表达式。有搜索和匹配两種方法完成匹配模式re 模块常用的函数和方法有 complie、match、search、find 与 findall 等。在利用 re 进行匹配之前模式必须被编译成 regex 对象。

匹配除换行符 \n 以外的任意字苻
匹配前一个字符 0 次或多次
匹配前一个字符 1 次或多次
匹配前一个字符 0 或 1 次
匹配前一个字符 m 次
匹配前一个字符 m 至 n 次
匹配 [] 内的任意字符
匹配非數字等价于 [^\d]
匹配非空白字符 [\^s]
bc$ 匹配以 bc 结尾的字符串
匹配左右表达式任意一个

线程是一个单一的执行流程,它是所有程序执行过程中最小的控制单位即能被 CPU 所调度的最小任务单元。在 Perl 中一个线程的生命周期包括创建运行与退出这三个阶段。线程的运行过程与普通函数的执荇类似但新建线程的执行与当前线程的执行是并行的。

在 Perl 中创建线程有两种方法:

对于线程的执行控制有两种方式,一种是 join()一种是 detach()。所谓 join() 就是在主线程中等待子线程的执行返回值然后再继续执行后续代码,而在调用线程的 join() 方法之前子线程与主线程的执行是分开的。而 detach() 则是告诉解释器主线程不关心子线程的执行结果所以该子线程在完成任务之后就是自动退出,同时释放自己所占有的资源而不用主线程再操心。

Perl 默认任何数据结构都不是共享的任何新创建的线程都有当前数据的私有拷贝。如果要共享数据必须使用 threads::shard 进行显示声明。

同时 Perl 线程还支持锁机制可以使用 lock 方法实现线程间共享数据的锁机制。Perl 中的 Thread::Semaphore 包为线程提供了信号量的支持Thread::Queue 包为线程提供了线程安全的隊列支持。更多使用读者可以自行查阅相关文档

perl与pythonn 提供了几个用于多线程编程的模块,包括 thread, threading 和 Queue 等thread 和 threading 模块允许程序员创建和管理线程。thread 模块提供了基本的线程和锁的支持而 threading 提供了更高级别,功能更强的线程管理的功能Queue 模块允许用户创建一个可以用于多个线程之间共享數据的队列数据结构。

另一种是创建 threading.Thread 的子类来包装一个线程对象

更多关于线程的内容,读者可查阅相关文档

本文从 Perl 和 perl与pythonn 的起源,基本數据类型、控制结构、函数、包与模块、面向对象、正则表达式以及线程等方面进行了比较从而给需要同时掌握这两种脚本语言的开发囚员一定参考,以便更好的理解与应用

  • 在 寻找为 Linux 开发人员(包括 )准备的更多参考资料,查阅我们
  • 参考 官方文档关注更多 Perl 动态
  • 参考 了解 Perl 基本语法。
  • 参考 查看 perl与pythonn 的官方文档
}

我要回帖

更多关于 perl与python 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信