现在的位置: 首页 > 综合 > 正文

Perl-05—上下文

2013年08月20日 ⁄ 综合 ⁄ 共 1489字 ⁄ 字号 评论关闭

Perl是上下文相关的,与很多其它语言有所不同。Perl中的运算和值的解释有时候依赖于围绕此运算或值的上下文。上下文包括数字、字符串、列表和标量。最常用到的有两种上下文:标量上下文列表上下文

返回列表值的运算需要一个列表,标量也一样。也就是说,Perl基于期望的返回值是单数还是复数来重载一定的运算。在标量上下文中,所求的表达式返回一个标量值;而在列表上下文中,所求的表达式返回一个标量值的列表。这就是两者之间的区别。

标量上下文对数据是作为数字进行运算还是作为字符串进行运算有影响;而列表上下文则对赋值语句返回的数据以及子程序或系统函数的参数和返回值有影响;

相应地,函数为每一个参数提供一个标量上下文和一个列表上下文。

例1:int(<STDIN>);

这个函数为它的参数提供了一个标量上下文;由于这个函数是要把它的参数转换成一个整数,只需要一个标量参数就可以了,所以,<STDIN>操作就只读进去一个标量数据作为参数传递给int(),如果输入了多个数据,则只传递第一个数据给函数int(),并返回转换后的整数标量值。

例2:sort(<STDIN>);

这个函数是对一个列表中的元素进行排序,它需要一个列表作为参数来操作,所以这个函数为<STDIN>操作提供了一个列表上下文;所以,Perl解释器会把<STDIN>操作所产生的所有输入的元素作为列表元素包装到一个列表中,然后把这个列表作为参数传递给sort()函数进行排序,当sort()函数执行完排序之后,会把排序后的所有数据元素再包装到一个列表中,并把这个排序后的列表作为返回值返回给sort()函数的上下文,即:列表上下文。

赋值操作符"="有点特别,它使用等号左边的参数来决定等号右边的参数的上下文。给一个标量变量赋值,就为等号右边的参数值提供了一个标量上下文;为一个数组或数组的一个片段赋值,就为等号右边的参数值提供了一个列表上下文;

用户定义的子程序可能会关心它们是被一个标量上下文调用还是被一个列表上下文调用,但是大多数子程序不需要关心这些,因为标量变量会被自动地插入到一个列表中;

列表是数据容器中的一系列项目,在Perl中,列表是指一系列的标量值,生成列表上下文可以使用括号,也可以使用数组。列表中也可以包含另一个列表,Perl解释器会先把父列表中的所有子列表都转化为一系列的标量变量,最后在父列表中列出所有的标量变量,包括子列表中的标量变量。在使用子程序时,这一点很重要。在使用包含子列表的列表时,Perl解释器会先列出所有子列表中的标量变量,然后才会对整个列表进行处理。

例:

 @Name = (LiuMin,WangYa,TongTong, LiuYing);

@Sex = ( ‘男’,‘女’);

@Age = (24,26,23,25);

@Friends = (@Name,@Sex,@Age);

上面语句中在为列表@Friends赋值之前,Perl解释器会先解析其子列表@Name、@Sex、@Age,把它们先解析成对应的标量列表值,这样列表(@Name,@Sex,@Age)的内容就变成内容为:

(LiuMin,WangYa,TongTong, LiuYing,‘男’,‘女’,24,26,23,25)

的这样一个新的列表了,然后再把这个新的列表赋值给列表@Friends,最后,列表@Friends的形式就是下面这样的:

@Friends = (LiuMin,WangYa,TongTong, LiuYing,‘男’,‘女’,24,26,23,25);

Perl解释器解析子列表的顺序是从左到右。当列表用于子程序或者函数调用时,也会遵循这样的原则;

抱歉!评论已关闭.