1.8 表处理(List Processing) BACKWARDFORWARD


在这章的前面, 我们提到Perl有两种主要的上下文, 表量上下文(为处理单个事物)和表上下文(为处理复数事物)。我们到目前已描述的许多传统操作符严格地是标量。他们总以单个的参数(或给二元操作符的一对单个参数), 并总产生单数的结果, 既使在一个表的上下文。所以,如果你写这个:

@array = (1 + 2, 3 -4, 5 * 6, 7 / 8);

你知道在右边的表恰好包含四个值, 因为普通的数学操作符总产生标量值, 既使在通过给数组赋值所提供的表上下文中。

但是,其他的Perl操作符能产生一个标量或一个表值, 决定于它们的上下文。它们只知道一个标量或一个表是否需要它们。但你怎样知道呢? 一旦你想到几个关键的概念, 知道这个很容易。

首先,表上下文必须由"环境"中的事物所提供。在上面的例子中,表赋值提供这个。如果你看到第二章The Gory Details和第三章函数中的各种语法概要,你将看到以表作为参数所定义的个种操作符。那就是提供一个表上下文的操作符。整个这本书,LIST作为一个特别技术术语, 意思是"提供一个表上下文的一个语法结构"。例如,你查找到sort, 你将看到语法概要:

sort LIST

那意思是sort给它的参数提供一个表上下文。

第二,在编译时,有一个表的任何操作符给这个表(LIST)的每个元素提供一个表的上下文。所以,在表中的上一级(top-level)操作符或实体知道它要产生它知道怎样产生的最好的表。这就是如果你说:

sort @guys, @gals, other();

那么每个@guys,@gals和other()知道它要产生一个表值。

最后,在运行时,表(LIST)元素中的每个安顺序产生它的表, 然后(这是重要的)所有分离的表合在一起, 头尾相接, 成为一个单个的表。一维的表就是最后处理的给要求一个表的函数。所以,如果@guys包含(Fred,Barney),@gals包含(Wilma,Betty), 并且other()含数返回单个元素的表(Dino), 那么sort看到的表是

(Fred,Barney,Wilma,Betty,Dino)

sort返回的表是

(Barney,Betty,Dino,Fred,Wilma)

一些操作符产生表(象关键字), 有些操作符消耗表(象print), 而一些操作符把表转换为其他的表(象sort)。最后一种操作符被认为是过滤器;只是不象shell数据流是从左到右, 因为表操作符对参数的操作是从右开始的。你能在一行写出几个表操作符:

print reverse sort map 1c keys %hash;

这得出%hash的关键字, 并给map函数, 通过应用1c操作符给它们把所有的关键字变为小写, 并把这个结果传给sort函数, 排序后把结果传给函数reverse, 其把表的顺序相反, 并把结果传给print函数, 并打印。

就象你看到的,用Perl比用英语更容易描述。


Copyright: NPACT BACKWARDFORWARD