书籍内容
本书内容包括: ·数字、字符串、代码块和positional。 ·文件、目录和输入/输出。 ·关联、子例程、类和角色。 ·junction和set。 ·正则表达式和内置文法。 ·并发特性:promise、supply和channel。 ·控制外部程序和其他高级特性。
前言/序言
前言
欢迎阅读本书第一版,如果你读过我写的其他一些书,这个书名看起来可能有些似曾相识。不过,这确确实实是我写的有关“Perl 6”语言的第一本书。我知道这个名字的确让人有些混淆,不过书名不是我定的,我只负责写书。
好吧,我知道这个回答可能还不能让你满意。
下面才是你想要的简要回答,如果学习Perl 是别人为你做出的选择,那么你可能应该看我的另一本书《Perl 语言入门》,那本书介绍的是正在广泛使用的Perl 5,那才是几乎无处不在、勇挑重担的可靠主力。这本书要介绍一个还在不断成长、尚未得到大量应用的新语言。
如果这个简短回答还不能消除你的困惑,下面再给出一个更长一些的答案。你之所以读这本书,可能是你很明确就是想学习Perl 6,也可能只是想学一门新语言,而不关心到底是哪种语言。
Perl 6 背后的故事
2000 年的Perl 大会上,一群Perl 人聚在加利福尼亚州蒙特雷的一个酒店会议室。那是个星期二。那一天晚些时候Perl 5 的核心发展小组(Perl 5 Porters)准备聚在一起讨论Perl 的未来。Chip Salzenberg 组织了这个几乎可以算是秘密的预备会,就是为了提出一些想法。不知为什么,他也拉我参加了这个预备会。
我们开始聊起Perl 5 当时面对的种种障碍:开发人员互有敌意,源代码很难管理,Perl 正在逐步失去人气。
Chip 试图用C++ 完全重写Perl(他称这个项目为Topaz),不过碰了壁。这也是他组织这次会议的部分原因。
我们闲聊着一些鸡毛蒜皮的事情,直到“The Perl Journal”的发行人Jon Orwant 突然把咖啡杯砸向对面墙壁。他想改变那种沉闷单调的气氛,因为那时我们都彬彬有礼得令人生厌。我们的思路不够开阔,目光不够远大。我觉得他低估了这个动作的暴力程度,这确实引起了我们的注意。我们如梦初醒,开始思考下一盘大棋,堪称无限大的一盘棋。
Perl 6 就此诞生。Perl 的创造者Larry Wall 第二天在他的演讲“洋葱的状态”(State of the Onion)中宣布了这一点。最值得一提的是,他谈到“Perl 6 将由社区共同设计”。所有人都认为Perl 6 将是Perl v5.6 之后就会发布的版本。但事实并非如此,不过由于这个原因,当时这个新的“Perl”语言被命名为“Perl 6”。
此后的数月中,人们纷纷提出建议,指出希望这个新语言中要包含哪些特性。Larry把这些意见整理为一系列 “启示录”(Apocalypse)文档,并对每个意见给出了回应。作为首席设计师,这些建议帮助他形成了自己的想法。最终他汇集形成“纲要”(Synopses),统一了他的所有想法。Damian Conway 在“注疏”(Exegeses)中进一步探讨了这些想法。所有这些都可以在https://design.perl6.org 找到。虽然这些文档有点古老,不过Perl 6 就是这样一步一步走来的。
Perl 6 的开发者发明了一个新的解释器,名为Parrot,原本要用来处理多种语言,希望能很容易地实现转码(transpile),以及完成很多其他很棒的事情。不过它并没有达到预期的目标。
与此同时,另一个团队让Perl 5 的开发重回复兴之路。Jarkko Hietaniemi 在2003 年发布了Perl v5.8。这个版本流行了一段时间,那时人们认为它将是Perl 5 的最后一个版本。
2005 年,Audrey Tang 在Glasgow Haskell Compiler(GHC) 上实现了Perl 6。她把它称为Pugs(Perl 6 User’s Golfing System)。人们终于有了可以运行Perl 6 的东西,并开始兴奋起来。他们开始填写特性列表以及实现必须通过的规范测试。不过,后来的开发工作再次停滞。
2007 年发布了Perl v5.10。这个版本有一些新特性,其中有些是从Perl 6“窃取”的。Perl 5 核心发展小组制订了一些正式的政策和程序。Perl 5 重回正轨。人们又开始整装待发。核心的开发人员对Perl 5 重燃激情。Perl 5 没有走向衰亡,而是东山再起。写这本书时,Perl 5 的当前版本是v5.26,而且仅仅几个月之后就会发布v5.28。
这造成了Perl 6 要与Perl 5 竞争的局面,而原本人们以为Perl 6 会取代Perl 5。这就是这个名字的混乱之处。有些人希望重新命名,避开“Perl”部分,不过总体来讲,大家都很抵制这种做法。
Perl 6 一直在缓慢前行,直到开发人员发布了圣诞版本(“Christmas”)。他们决定,无论如何都要把2015 年圣诞节前的版本作为第一个官方版本。他们达到了这个目标,而且从那以后发展都很稳定。
预备知识
这里假设你知道如何使用代码编辑器(而不是字处理器)创建纯文本文件,而且知道如何在一个终端(UNIX 类系统或Windows)中运行基本命令。
这些都是作为程序员必备的基本技能,不过我明白你可能需要在学习编程的同时去掌握这些技能,这就有些压力。所以我会在下一节推荐几个在线运行代码的工具,利用这些工具可以避免使用终端和文件。不过,千万不要完全依赖这些工具。
我会简单地介绍编程,不过这个内容本身就需要大部头的书来介绍。Perl 6 是一个面向对象语言,我不会过多谈论面向对象的理论和实践,而会把重点放在语言本身。
很遗憾,这本书不会教你如何成为一个程序员。不过,别灰心,很多程序员都是通过那些并不教编程的书掌握了他们的编程技能。
你无法在这本书中学到有关Perl 6 或编程的全部知识。不过,学无止境,不要气馁。
获得Rakudo
Perl 6 从一开始就设计为要在多个实现上运行,不过当时没有人知道到底是哪些实现。有一个实现是将Perl 6 编译为Java 虚拟机(Java Virtual Machine,JVM),另外一个实现是在JavaScript 上运行Perl 6。此外还有一个MoarVM (“Metamodel On A Runtime”),这是走得最远的一个实现,也是这本书中我要使用的实现。
Perl 6 的版本由测试规范的版本以及测试规范中涵盖的内容来定义。写这本书时,Perl 6 的版本是v6.c (v6.d 即将发布)。Rakudo 2018.04 是Moar 2018.04 上的Perl 6,不过版本仍然是v6.c。查看版本时可以看到:
% perl6 -v
This is Rakudo Star version 2018.04 built on MoarVM version 2018.04 implementing Perl 6.c.
在本书中“Rakudo”和“Perl 6”是同一个意思,不过这不完全正确。如果你知道哪里不正确,完全可以选择你自己的实现。
Perl 6 无需安装就可以尝试。Glot.io(https://glot.io/new/perl6)和Try It Online(https://tio.run/#perl6)都提供了基于浏览器的Perl 6 环境。这些环境可以用来运行单文件程序,对于学习这本书的大部分内容已经够用。
如果你确实感兴趣,也可以使用一个Perl 6 Docker 容器(https://hub.docker.com/_/rakudo-star/):
% docker run -it rakudo-star
你的本地包管理器可能就包含有这个容器,可以查找perl6、rakudo 或rakudo-star 之类的包。如果在Windows 上使用Chocolatey(一个命令行包管理软件 ),可以用我维护的一个包来安装:
C:\ choco install rakudo-star
还可以从Rakudo.org 下载源代码或二进制包。我就是从这里得到了我的macOS 包。一旦安装了Rakudo,应该会有一个perl6 二进制包。试着运行,确保它能正常工作。-v 开关会给出有关你的perl6 的一些信息:
% perl6 -v
This is Rakudo Star version 2018.04 built on MoarVM version 2018.04 implementing Perl 6.c.
如果没有提供参数,perl6 会带你进入REPL(Read-Eval-Print-Loop,表示读取——
求值——打印——循环)。可以在> 提示符后面键入一些文本(用单引号包围),
REPL 会回显这些文本:
% perl6
To exit type 'exit' or '^D'
> 'Hello Camelia!'
Hello Camelia!
还可以检查变量的值。有一些特殊变量能告诉你有关设置的信息,如果需要报告问题,这些变量会很有用:
% perl6
To exit type 'exit' or '^D'
> $*VM
moar (2018.04)
> $*PERL
Perl 6 (6.c)
如果能走到这一步,说明你已经有了一个能工作的Perl 6 !
如何使用这本书
这是一本教程。我的任务是找出这个语言中你要了解的关键部分,使你能举一反三地自学其余的部分。这不是一本详尽的参考书,书中只涵盖了少量内容,还有更多内容没有谈到。这本书没有按主题来组织,而且章节标题只能大致描述相应内容。我会尽早介绍新主题,不过,大部分主题在介绍前都要求先有一些积累。
有时候术语可能让人很有压力,我在最后提供了一个术语表。如果你想不起来某个概念的含义,可以查看那个术语表。
你会在这本书里看到大量练习。一定要做这些练习!看到练习时,要应用你刚刚学到的知识,然后对照检查我给出的答案(附录A),答案中还会额外包含一些信息。我不会对你们隐藏任何信息,不过会让你们花些功夫努力搞清楚一些概念,这样才有意思。练习很重要的一部分就是在努力奋斗中成长。下面来做个练习,看看具体是怎样的。
我把这本书设计为希望你能够在两三周内把它读完。要按顺序阅读各个章节,因为后面的内容建立在前面的基础上。只要在后面的章节中会用到,我都会在之前做出解释,不过也有例外。有些概念可能出现在其他不同主题的章节中,或者甚至出现在练习答案里。所以一定要做练习!看完一章后,完成这一章的练习,然后休息一下。
不要想着一口吃个胖子,学习时不要一次贪多。
寻求帮助
如果无法解决你的Perl 6 问题,可以有很多选择。官方网站https://www.perl6.org列出了与其他Perl 6 用户交流的多种方法。我就很喜欢把Stack Overflow(https://stackoverflow.com/)作一个问答网站。
本书使用约定
以下是本书使用的排版约定:
斜体(Italic)
表示新术语、URL、email 地址、文件名和文件扩展名。
等宽字体(Constant width)
用于程序代码清单,以及在段落中用来指示程序元素,如变量或函数名、数据库、数据类型、环境变量、语句和关键字。还用于命令和命令行选项。
等宽粗体(Constant width bold)
表示要由用户直接键入的命令或其他文字。
等宽斜体(Constant width italic)
表示这个文本要替换为用户提供的值或由上下文确定的值。
使用代码示例
这本书的补充材料(代码示例、练习等)可以从http://www.learningperl6.com/ 下载。
这本书的目的是帮助你完成工作。一般来讲,你可以在你的程序和文档中使用这些代码,不需要联系我们来得到许可,除非你直接复制了大部分的代码。例如,如果你在编写一个程序,使用了本书中的多段代码,这并不需要得到许可,但是出售或发行O’Reilly 书示例代码光盘则需要得到许可。回答问题时如果引用了这本书的文字和示例代码,不需要得到许可,但是如果你的产品文档借用了本书中的大量示例代码,则需要得到许可。
我们希望但不严格要求标明引用出处。引用信息通常包括书名、作者、出版商和ISBN。例如“Learning Perl 6 by brian d foy(O'Reilly). Copyright 2018 brian d foy, 978-1-491-97768-2”。
如果你认为你在使用代码示例时超出了合理使用范围或者上述许可范围,可以随时联系我们:permissions@oreilly.com。
O’Reilly 在线学习平台(O’ReillyOnline Learning)
近40 年来,O’ReillyMedia 致力于提供技术和商业培训、知识和卓越见解,来帮助众多公司取得成功。
我们拥有独一无二的专家和革新者组成的庞大网络,他们通过图书、文章、会议和我们的在线学习平台分享他们的知识和经验。O’Reilly 的在线学习平台允许你按需访问现场培训课程、深入的学习路径、交互式编程环境,以及O’Reilly 和200 多家其他出版商提供的大量文本和视频资源。有关的更多信息,请访问http://oreilly.com。
意见和疑问
对本书的评价和疑问请寄至出版社:
美国:
O’ReillyMedia, Inc.
作者简介
brian d foy是一位多产的Perl培训师和作者,他创办的The Perl Review通过教育、咨询、代码审查等工作着力帮助人们使用和理解Perl。他经常在Perl大会上发表演讲,另外他还合作撰写了《Learning Perl》《Intermediate Perl》和《Effective Perl Programming》,并著有《Mastering Perl》。