找回密码
 注册
查看: 2276|回复: 0

perl语言中标量和列表上下文

[复制链接]
发表于 2011-11-13 10:22:37 | 显示全部楼层 |阅读模式
本节是本章中最重要的章节。事实上,是整本书的最重要一节。可以毫不夸张地说,你的整个Perl 职业生涯都是建立在对
本节的理解之上。如果之前的章节你都未认真阅读,那本章千万不能马虎。
但这并非说本节难于理解。本节仅是一个简单的概念:一个给定的表达式在不同的上下文中其含义是不同的。这本身没什
么新奇的地方;事实上这在自然语言中是司空见怪的。例如,在英语中◆,假设某人问你“read”◆的含义。它的具体含义
和你怎样使用它有关。除非你知道它使用的上下文环境,否则不知道其确切的含义。
◆如果英语不是你的母语,那这个类比可能对你不太明显。但上下文相关在任何语言中都存在,因此可以在你自己的母语中找到这样类
似的例子。
◆抑或它们问的是“red”的含义,如果他们是嘴上说的。无论哪种情况,其含义都是不确定的。如Donglas Hofstadter 所言,没有一种语
言可以把每一种思想都明白无误的表达出来,特别是本句话。
上下文是指表达式存在的地方。当Perl 解析表达式时,它通常期望一个标量值或者列表值◆。这既称为表达式的上下文环
环境◆。
◆当然,也可能是别的类型。还有些别的contexts 没有在此处给出。没有人知道Perl 中使用了多少种contexts;Perl 社区中的首脑人物在
这个问题上也没一致答案。
◆这和人类语言中使用的情况类似。如果犯了语法错误,那很快会被发现,因为你知道在特定的地方使用特定的词。最终,你将用这种方
法来阅读Perl,但首先应该以这种方式来思考。
42 + something #something 必须是标量
sort something #something 必须是列表
如果something 是相同的字符串,在一种情况下,它返回一个变量值,在另一种情况下,它可能返回列表◆。Perl 中的表达
式将根据其context 返回适当的值。例如,一个数组的“name◆”,在列表context 中,它返回列表元素;在标量context 中,
它返回数组元素的个数:
◆当然这个列表可能只包含一个元素。也可能为空,或者包含任意数量的元素。
◆数组@people 的真实名字是people。@只是一个限定词(qualifier)。
@people = qw( fred barney betty );
@sorted = sort @people; #列表context:barney , betty, fred
$number = 42 + @people; #标量context:42+3,得到45
甚至普通的赋值(赋给标量或者列表)也产生不同的contexts:
@list = @people; #3 个People 的列表
$n = @people ; #数字3
不要得到这样的结果:在标量context 中能返回元素的个数,在列表context 中就一定返回这些元素。许多list-producing 的
表达式◆将返回一些更有趣的结果。
◆对于本节, “list-producing”表达式和“scalar-producing”是没有多少区别的。任何表达式都可以产生标量或者列表,这依赖其context。因
此,当我们说“list -producing expressings”,我们是指那些通常在列表context 中使用的表达式,当其在标量环境中使用时可能产生意想不
到的结果(如reverse 或者@fred)。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|小黑屋|生物统计家园 网站价格

GMT+8, 2024-11-21 18:39 , Processed in 0.051597 second(s), 16 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表