1.2.1 名词 BACKWARDFORWARD


一个变量只是为保留某种含义的一个方便的地方, 拥有一个名字的一个地方, 这样当你后来查找它时, 你知道在哪儿找到这个特别含义的事物。就象在现 实生活中一样,有各种地方存储东西,有些是相当私有的,有些是公共的。有些地方是暂时的。而有些地方是更永久的。虽然计算机科学家热衷于谈论变量的“范围”,但是这个范围就表明变量的全部意义。Perl有各种方便的方法处理范围观点, 这些将是你以后喜欢学习的。(当你觉得奇怪时, 在第三章查找形容词"local"和"my"。)

但分类变量的一个更有用的直接方法是它们所保留 的数据类型。就象英语,Perl的主要类型区别是单 数和复数。字符串和数字是单数数据,而字符串或数字的表是复数的。(当我们到面向对象编程时, 你 将发现从外界看一个对象是单数, 但从内部看是复 数, 象一类学生。)我们把一个单数变量称为一个标量, 一个复数变量称为一个数组。因为在一个标量 变量能存储一个字符串,所以我们可以把我们的第 一个例子写得较长, 如下:

注意我们没有必要预定义变量$phrase是什么类型。字母$告诉Perl: phrase是一个标量变量, 即, 包含一个单数值的一个标量。一个数组变量将以字符@开始。($是"S"的仿效, 为scalar(标量), 而@是"a"的仿效, 为array(数组)。)

Perl有其他的变量类型, 如"hash","handle"和"typeglob"。象标量和数组一样,变量的这些类型也是有趣的字符[4]。为完整性,这儿列出你将遇到的全部有趣字符:


表 1-1 : 变量语法


类型       字符    例子     用 于:


scalar(标量)    $     $cents   一个单个的值( 数字或字符串 )

array (数组)    @     @large   一组值, 按数字下标索引

hash(hash表)    %     %interest 一组值, 按字符索引

subroutine(子程序) &     &how    一个可调用的Perl程序段

typeglob(全部内容) *     *struck  被称为struck的全部


单数

从我们的例子, 你能看到标量可以用 = 操作被赋予 一个新值, 就象许多其他计算机语言一样。标量变量能被赋予任何标量值:整型,浮点数,字符串,和对其他变量或对象的引用。有许多方法产生用于 赋值的这些值。

象在UNIX shell中一样, 你能使用不同的引号机制, 以产生不同的类型值。双引号用作变量插入[5], 反 斜线用于转义字符[6], 而单引号用于插入和转义。 反引号将执行一个外部程序并反回这个程序的输 出,所以就象单个的字符串包含输出的所有行,你 能得到这个。   

$answer = 42; #一个整型

$pi = 3.14159265; #一个"实型"数

$avocados = 6.02e23; #科学表示

$pet = "Camel"; #字符串

$sign = "I love my $pet"; #有插入的字符串

$cost = 'It costs $100'; #没有插入的字符串

$thence = $whence; #另一个变量

$x = $moles * $avocados; #一个表达式

$cwd = 'pwd'; #从一个命令输出的字符串

$exit = system("vi $x"); #一个命令的数字状态

$fido = new Camel "Fido"; #一个对象

未初始化的变量自动地按着需要而存在。下面是例 子,变量以空值, 或者""或者0创建。按着你使用变量的位置,将被自动地解释为字符串,数字,或 “真(true)”和“假(false)”(一般地称为布尔值)。各种操作符希望某类值作为参数,所以我们说 那些操作符给参数提供一个标量上下文。有时是更特别的,我们说操作符给那些参数提供了一种数字上下文,一种字符上下文,或一种布尔上下文。(以后, 我们也将谈到表上下文, 这是和标量上下文相 反。)Perl将在合理的范围内, 自动地把数据转换为 当前上下文所要求的形式。例如,你编下列程序:

$camels = '123';

print $camels + 1, "";

$camels原来值是一个字符串, 但它被转换为一个数 字, 加1并赋给它本身, 然后再转回一个打印出是 "124"的字符串。由""表示的新行也是字符串上下文, 但它已是一个字符串, 不必转换。但注意,那儿我们必须使用双引号--使用单引号,即''将导致两个字 符的一个字符串, 由一个反斜线和n组成, 而不是一个新行的定义。

所以, 双引号和单引号还是另一种指定上下文的方法。一个引号字符串内部结构的解释依赖于你使用 哪一种引号。后面,我们将看到某些其他操作, 如:用于匹配或替代的操作,语法上象引号一样起 作用,但以某种特殊方法使用字符串。这些也象双 引号字符串一样起作用。双引号上下文是Perl的"插 入"上下文, 并且由许多不类似于双引号的操作提供。

复数

某类变量保存多个逻辑上紧密联结的值。Perl有两 类多值变量: 数组和hash表。在许多种方法中,这 些的行为象标量一样。当需要时,他们没有任何条 件就存在。当你给他们赋值时,他们给赋值语句右 部提供一个表(list)上下文。

当你想以数字来查寻时,你最好使用一个数组。当 你想以名字来查寻时,你最好使用一个hash表。这 两个概念是互补的。你将经常看到人们使用一个数 组,以把月份的数字转换为月份的名字,并切相应 地使用一个hash表, 把月份的名字转回月份的数 字。(当然, 没有限制hash表只保存数字。例如,你 可以用一个hash表把月份名字转换为姓名。)

数组

一个数组是标量的一个有序表, 由表中标量的位置 [7]来存取这些标量。这个表中可以含有数字,或字 符串,或他们的混合。(事实上, 也可以包含对其他 表的引用,但是当我们讨论多维数组时,将到第四 章,引用和嵌套的数据结构。)为给一个数组赋值一 个表值, 你只要把变量(用一对括号)组合起来:

@home = ("couch", "chair", "table", "stove");

相反, 如果你在一个表的上下文中使用@home, 例如, 在表赋值的右面, 你得到与输如同样的表。所以, 你可以用这个数组设置四个标量,如下:

($potato, $lift, $tennis, $pipe) = @home; 这些称为表赋值。他们逻辑上是并行的,所以你能象下面一样交换两个变量:

($alpha,$omega) = ($omega,$alpha);

与C语言一样, 数组下标从0开始, 所以当你谈到数组的第一个到第四个元素时, 你应用下标0到3取出这些元素[8]。数组下标应用方括号括起来[象这样], 所以如果你选择数组的一个元素时, 你应这样 $home[n], 其中n是你选择元素的下标(小于元素的 个数)。看下面的例子。因为你正处理的元素是一个标量,所以你应用$作为它的前缀。

如果你想一次给数组的一个元素赋值, 那么你就如下写前面的赋值:

$home[0] = "couch";

$home[1] = "chair";

$home[2] = "table";

$home[3] = "stove";

由于数组是有序的, 你能对他们使用各种有用的操作, 例如, 栈操作push和pop。总之,栈就是一个有头和尾的有序表。一个特别的尾。Perl把你的表的尾作为栈的顶。(虽然多数Perl编程者认为, 一个表是水平的, 栈顶在右面。)

hash表(关联数组)

一个hash表是标量的一个无序集, 按着和每个标量联结的字符串的值来存取。因为这个,hash表经常 被称为"关联数组"。但是这对懒惰的打字员是太长了,我们经常谈论他们,所以我们决定命名他们为短的和直接的名字[10]。我们选用"hash表"名字的 另一个原因是: 强调他们是无序的事实。(他们在内部巧合地使用散列表查找实现, 这也是为什么hash 表是如此快, 并切无论你输入多少值, 仍然这样快。)你不能push或pop一个hash表, 因为这样没有意义。一个hash表没有头和尾。然而hash表是特别 强有力和有用的。直到你开始根据hash表思考时, 你才真正地用Perl思考。   

因为一个hash表的关键字不是自动地由位置隐含的, 所以当你建立一个hash表时,必须提供关键字和值。 你也能象一个数组一样给它赋予一个表,但表中的 每对值将作为一个关键字/值对。假设你想把缩写的 日期名转为相应的完整的名字。你能写这个表赋值为:

%longday = ("Sun", "Sunday", "Mon", "Monday", "Tue", "Tuesday", "Wed", "Wednesday", "Thu", "Thursday", "Fri", "Friday", "Sat", "Saturday");

因为象这样定义一个hash表, 有时是难读的, 所以 Perl提供=>(等号, 大于号)序列作为对逗号的分离 符。使用这个语法(和某些创建性格式), 是容易看 到哪个字符串是关键字, 哪个字符串是对应的值。

%longday = ( "Sun" => "Sunday", "Mon" => "Monday", "Tue" => "Tuesday", "Wed" => "Wednesday", "Thu" => "Thursday", "Fri" => "Friday", "Sat" => "Saturday", );

你不仅能象上面一样给一个hash表赋一个表, 但如果你在表的上下文使用一个hash表, 它将把hash表按任意顺序转回一个(关键字/值)对的表。这有时是有用的。人们更经常使用keys函数提取一个表的关键字。这个关键字表也是无序的,但如果希望能使用sort函数容易地排序。

因为是一类有趣的数组,你通过括号中的关键字选择hash表一个的元素。所以,例如,如果你想发现 上面hash表中和Wed相联结的值, 你将使用 $longday"Wed"。注意,你正处理一个标量值,所以你使用$, 而不是%。

语言上说,在一个hash表包含的关系是所有的或所 属的, 象英语中的"of", 或象"'s"。Adam的wife是 Eve, 所以我们写:

$wife"Adam" = "Eve";


Copyright: NPACT BACKWARDFORWARD