| 关键词: Servlet 方法 服务器 目录 servlets html java 输出 子目录 一个 |
1.1 从头开始 我们认为 Perl 是一种容易学习和使用的语言,而且我们希望能证明我们是对的.Perl 比较简单的一个方面是你用不着在说想说的东西之前先说很多其他东西。在很多其他编程语言里,你必须首先定义类型,变量,以及你需要用到的子过程,然后才能开始写你要执行的第一行程序。虽然对于那些需要复杂数据结构的复杂问题而言,声明变量是一个好主意.但是对于很多简单的日常问题,你肯定喜欢这样的一种编程语言,你只需简单说: print "Howdy, World!\n"; 程序就能得到你所需的结果. Perl 就是这样的一种语言。实际上,上面这个例子是一个完整的程序,如果你将它输入到 Perl 解释器里,它就会在你的屏幕上打印出 "Howdy, world!"(例子中的 \n 在输出中产生一个新行。) 同样,你也用不着在说完之后说很多其他东西。和其他语言不同的是,Perl 认为程序的结尾就是一种退出程序的正常途径,如果你愿意的话,你当然可以明确地调用 exit 函数来退出程序。就象你可以声明一些你所用的变量,或者甚至可以强迫自己声明所用的所有变量,但这只是你的决定。用 Perl 你可以自由的做那些正确的事,不过你要仔细的定义它们。 关于 Perl 的容易使用还有很多其他理由,但是不可能全在这里列出来,因为这是这本书余下部分说要讨论的内容。语言的细节是很难理解的,但是 Perl 试图能把你从这些细节中解放出来。在每一个层次,Perl 都能够帮助你以最小的忙乱获得最大的享受和进步,这就是为什么这么多 Perl 程序员能够如此悠闲的原因吧。 本章是 Perl 的一个概述,所以我们不准备介绍得过于深入,同时我们也不追求描述的完整性和逻辑性。那些是下面章节所要做的事情。如果你等不及了,或者你是比较死板的人,你可以直接进入到第二章,集腋成裘,获取最大限度的信息密度。另外如果你需要一个更详细的教程,你可以去找 Randal 的 Learning Perl (由 O'Reilly&Associates 出版)。 不管你喜欢把 Perl 称做想象力丰富的,艺术色彩浓厚的,富有激情的还是仅仅是具有很好的灵活性的东西,我们都会在本章中给你展现 Perl 的另一个方面。到本章结束时,我们将给你展现 Perl 的不同方面,并帮助你建立起一个 Perl 的清晰完整的印象。 1.2 自然语言与人工语言 语言最早是人类发明出来方便自身的东西。但在计算机科学的历史中,这个事实偶尔会(注:更准确地说,人们会偶尔记起这个事实)被人们忘记。因为 Perl 碰巧是由一个语言学家设计的(可以这么说吧),因此它被设计成一个可以象自然语言那样使用的编程语言。通常,做到这一点要处理很多方面的事情,因为自然语言可以同时在几个不同的层次做得非常好。我们可以列举出很多语言设计上的原则,但是我们认为语言设计最重要的原则就是:处理简单的事情必须容易,并且能够处理困难的事情(其实这是两个原则)。这对你来说也许显而易见,但是有很多计算机语言在其中的某个方面做得不好。 自然语言在上述两个方面都做得很好,因为人们总是需要表达简单的事情和复杂的事情,所以语言进化成能够同时处理这两种情况。Perl 首先被设计成可以进化,并且实际上也已经进化了。在这个进化过程中,很多人做出了很多贡献。我们经常开玩笑说:骆驼(Perl)是一匹委员会设计的马,但是如果你想一想,骆驼非常适应沙漠中的生活。骆驼已经进化成为相当能自给自足(另一方面,骆驼闻起来不怎么样,Perl也一样),这也是我们选择骆驼作为 Perl 的吉祥物众多原因中的一个,而和语言学没有什么关系。 现在,当有人提起“语言学”的时候,一些人关注于字,另一些人则关注句子。但是词和句子只是拆分一大段话的两个简单方法。它们要么可以拆分成可以更小的表意部分,要么可以并成更大的表意部分。任何部分所表达的意思很大程度上依赖于语法,语义以及所处的环境。自然语言由不同词性的词:名词,动词等等组成。在一个隔离的环境中说"狗"的时候,我们认为它是一个名词,但是你也可以以不同的方式使用同一个词。在 "If you dog a dog during the dog days of summer, you will be a dog tired dogcather"(如果你在三伏天追赶一只狗,你就会成为疲劳的捕狗人。)这个句子中,dog 这个名词在这个环境里可以作为动词,形容词,和副词。(注:你看了这句话可能都对这些贫嘴的狗词汇都烦了。不过我们只是想让你理解为什么 Perl 和其他典型的计算机语言不同, TMD!) Perl 也根据不同的环境来处理词,在下面的章节中我们将会了解到 Perl 是如何进行处理的。现在我们只需要记住 Perl 象一个好听众那样努力理解你说的话. 你只需要说你的意思,Perl 就能理解你的意思(除非你在胡说,当然 Perl 解释器更容易听懂 Perl,而不是英语或斯瓦希里语。) 回到名词,一个名词可以命名一个特定的对象,或者它可以命名非特指的某类对象. 绝大多数计算机语言将上述两个方面区别开来。只有我们把特定对象当作值而把泛指的对象当做变量。值保存在一个地方,而变量和一个或多个值关联。因此无论是谁解释变量都必须保持跟踪这个关联。这个解释器也许是你的大脑或者是你的计算机. 1.2.1 变量语法 一个变量就是用来保存一些东西的地方,这个地方有一个名字,这样当你需要使用这些东西的时候就知道从哪里找到它。在日常生活中有很多不同地方用来储存东西,有些是很秘密的,有些则是公开的。有些是暂时性的,有些则更为永久。计算机学家很喜欢讨论变量范围。 Perl 有不同于其他语言的简便方法来处理范围问题。你可以在本书后面适当的时候学习到相关的知识(如果你很急迫地知道这些知识,你可以参阅二十九章,函数,或第四章,语句和声明,里“范围声明”。) 一个区分变量类型最直接的方法是看变量里面保存了何种数据。象英语一样,Perl 变量类型之间区别主要是单数和复数,字符串和数字是单个数据,而一组数字和字符串是复数(当我们接触到面对对象编程时,对象就象一个班的学生一样,从外部看,它是一个单数,而从内部看则是一个复数)我们把单数变量称为标量,而把复数变量称为数组。我们可以将第一个例子程序改写成一个稍微长一些的版本: $phrase = "Howdy, world!\n"; print $phrase; 请注意,在 Perl 中我们不必事先定义 $phrase 是什么类型的变量,$ 符号告诉 Perl, phrase 是一个标量,也就是包含单个数值的变量。与此对应的数组变量使用 @ 开头。(可以将 $ 理解成代表 "s" 或 "scalar"(标量),而 @ 表示 "a" 或 "array" (数组)来帮助你记忆。) Perl 还有象“散列”,“句柄”,“类型团”等其他一些变量类型,与标量和数组一样,这些变量类型也是前导趣味字符,下面是你将会碰到的所有趣味字符: |类型 | 字符 | 例子 | 用于哪种名字| |标量 | $ | $cents | 一个独立的数值(数字或字串)| |数组 | @ | @large | 一列数值,用编号做键字| |散列 | % | %interest | 一组数值,用字串做键字| |子过程 | & | &how | 一段可以调用的 Perl 代码| |类型团 | * | *struck | 所有叫 struck 的东西| 一些纯粹语言主义者将这些古怪的字符作为一个理由来指责 Perl。这只是表面现象。这些字符有很多好处,不用额外的语法变量就可以代换成字串只是最简单的一个。Perl脚本也很容易阅读(当然是对那些花时间学习了 Perl 的人!)因为名词和动词分离,这样我们就可以向语言中增加新的动词而不会破坏旧脚本。(我们告诉过你 Perl 被设计成是可以进化的语言。)名词也一样,在英语和其他语言中为了满足语法需要有很多前缀。这就是我们的想法。 1.2.2 单数变量 从我们前面的例子中可以看到,Perl中的标量象其他语言一样,可以用 = 对它进行赋值,在 Perl 中标量可以赋予:整数,浮点数,字符串,甚至指向其他变量或对象的引用这样深奥的东西。有很多方法可以对标量进行赋值。 与 Unix (注:我们在这里和其他所有地方提到 Unix 的时候,我们指的是所有类 Unix 系统,包括 BSD,Linux,当然还包括 Unix)中的 shell 编程相似,你可以使用不同的引号来获得不同的值,双引号进行变量代换(注:有时候 shell 程序员叫“替换”,不过,我们宁愿在 Perl 里把这个词保留给其他用途。所以请把它称之为“代换”。我们使用的是它的字面意思(“这段话是某种宗教代换”),而不是其数学含义(“图上这点是另外两点的插值”))和反斜扛代换(比如把 \n 转换成新行).而反勾号(那个向左歪的引号)将执行外部程序并且返回程序的输出,因此你可以把它当做包含所有输出行的单个字串. * $answer = 42;# 一个整数 * $pi= 3.14159265# 一个"实"数 * $pet = "Camel";# 字串 * $sign= "I ove my $pet";# 带代换的字串 * $cose= 'It cose $100';# 不带代换的字串 * $thence = $whence;# 另一个变量的数值 * $salsa = $moles * $avocados;# 一个胃化学表达式 * $exit= system("vi $file");# 一条命令的数字状态 * $cwd= `pwd`;# 从一个命令输出的字串 上面我们没有涉及到其他一些有趣的值,我们应该先指出知道标量也可以保存对其他数据结构的引用,包括子程序和对象. 如果你使用了一个尚未赋值的变量,这个未初始化的变量会在需要的时候自动存在.遵循最小意外的原则,该变量按照常规初始化为空值,"" 或 0.根据使用的地方的不同,变量会被自动解释成字符串,数字或"真"和"假"(通常称布尔值).我们知道在人类语言中语言环境是十分重要的.在 Perl 中不同的操作符会要求特定类型的单数值作为参数.我们就称之为这个操作符给这些参数提供了一个标量的环境.有时还会更明确,比如说操作符会给这些参数提供一个数字环境,字符串环境或布尔环境.(稍后我们会讲到与标量环境相对的数组环境)Perl 会根据环境自动将数据转换成正确的形式.例如: $camels = '123'; print $camels +1, "\n"; $camels 最初的值是字符串,但是它被转换成数字然后加一,最后有被转换回字符串,打印出 124."\n" 表示的新行同样也在字符串环境中,但是由于它本来就是一个字符串,因此就没有必要做转换了.但是要注意我们在这里必须使用双引号,如果使用单引号 '\n',这就表示这是由反斜扛和 n 两个字符组成的字符串,而不表示一个新行. 所以,从某种意义上来说,使用单引号和双引号也是另外一种提供不同环境方法.不同引号里面的内容根据所用的引号有不同的解释.(稍后,我们会看到一些和引号类似的操作符,但是这些操作符以一些特殊的方法使用字符串,例如模式匹配,替换.这些都象双引号字符串一样工作.双引号环境在 Perl 中称为代换环境.并且很多其他的操作符也提供代换环境.) 同样的,一个引用在"解引用"环境表现为一个引用,否则就象一个普通标量一样工作,比如,我们可以说: $fido = new Camel "Amelia"; if (not $fido) { die "dead camel"; } $fido->saddle(); 在这里,我们首先创建了一个指向 Camel 对象的引用,并将它赋给变量 $fido,在第二行中,我们将 $fido 当成一个布尔量来判断它是否为真,如果它不为真,程序将抛出一个例外.在这个例子中,这将意味着 new Camel 构造函数创建 Camel 对象失败.最后一行,我们将 $fido 作为一个引用,并调用 Camel 对象的 saddle() 方法.今后我们还将讲述更多关于环境的内容.现在你只需记住环境在 Perl 中是十分重要的,Perl 将根据环境来判断你想要什么,而不用象其他编程语言一样必须明确地告诉它. |
|
声明:文章版权归原作者所有 部分文章转自互联网 如有侵权请联系
[邮箱地址] 删除
|