Raku学习手册 Perl6语言

《Raku学习手册 Perl6语言》

  • 出版社:中国电力出版社
  • ISBN:9787519848002
  • 版次:1
  • 商品编码:12762273
  • 品牌:中国电力出版社(zhongguodianlichubanshe)
  • 包装:平装
  • 开本:16开
  • 出版时间:2020-11-01
  • 用纸:胶版纸
  • 页数:500
  • 字数:600000
基本介绍书籍目录点评信息
  • 书籍内容

    本书内容包括: ·数字、字符串、代码块和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》。
  • 序 .1
    前言 .3
    第1 章 概论 13
    1.1 为什么使用Perl 6? . 13
    1.2 REPL 入门 14
    1.3 阅读文档 16
    1.4 基本语法 17
    1.4.1 项 17
    1.4.2 操作符和表达式 . 18
    1.4.3 语句 21
    1.4.4 代码块 . 21
    1.4.5 注释 22
    1.4.6 空白隐身. 23
    1.4.7 对象和类. 24
    1.5 变量 25
    1.5.1 简单输出. 27
    1.5.2 词法作用域 27
    1.5.3 预定义变量 29
    1.6 建立和运行一个程序 . 30
    1.7 小结 31
    第2 章 猜数 32
    2.1 绑定和赋值 . 32
    2.2 MAIN 程序 . 33
    2.2.1 程序参数. 34
    2.2.2 提示输入值 36
    2.3 字面数 37
    格式化数字 39
    2.4 数值操作 40
    2.5 条件执行 43
    2.5.1 布尔值 . 43
    2.5.2 比较 46
    2.5.3 条件分支. 50
    2.6 汇总 53
    2.7 小结 55
    第3 章 数字 56
    3.1 数值类型 56
    3.2 整数 57
    3.2.1 类型约束. 58
    3.2.2 智能匹配. 59
    3.3 有理数 61
    3.4 虚数和复数 . 64
    3.5 非常小和非常大的数 . 66
    3.6 数值层次结构 67
    3.7 小结 68
    第4 章 字符串 69
    4.1 字面量引号 . 69
    4.2 转义字符串 . 71
    4.2.1 引号副词. 72
    4.2.2 字符串操作符和方法 73
    4.2.3 查看字符串 74
    4.2.4 标准字素. 76
    4.2.5 字符串比较 77
    4.2.6 提示输入. 79
    4.2.7 数字到字符串转换 . 81
    4.2.8 字符串到数字转换 . 82
    4.3 插值字符串 . 83
    4.4 Here Doc 87
    4.5 Shell 字符串 88
    Shell 安全 89
    4.6 更酷的引号 . 90
    4.7 小结 92
    第5 章 基本代码块 .93
    5.1 代码块 93
    5.1.1 词法作用域 94
    5.1.2 控制结构. 95
    5.1.3 Phaser 98
    5.1.4 存储代码块 . 101
    5.1.5 有参数的代码块 102
    5.2 简单子例程 106
    命名子例程. 108
    5.3 Whatever 代码 109
    子集 110
    5.4 小结 . 111
    第6 章 Positional . 112
    6.1 构造列表 112
    迭代所有元素 116
    6.2 范围 . 120
    @ 强制转换操作符 . 122
    6.3 序列 . 123
    6.3.1 无限惰性列表 124
    6.3.2 收集值 127
    6.4 单元素访问 128
    6.4.1 改变一个元素 131
    6.4.2 多元素访问 . 131
    6.5 数组 . 132
    6.5.1 构造数组 133
    6.5.2 插值数组 134
    6.5.3 数组操作 135
    6.5.4 列表的列表 . 137
    6.5.5 扁平列表 138
    6.5.6 有趣的子列表 139
    6.6 组合列表 140
    6.6.1 Zip 操作符Z 140
    6.6.2 交叉操作符X 142
    6.6.3 超操作符 142
    6.6.4 归约操作符 . 143
    6.7 过滤列表 145
    6.8 转换列表 146
    6.9 列表排序 147
    6.10 基于多重比较的排序 149
    6.11 小结 151
    第7 章 出现问题时 152
    7.1 异常 . 152
    7.1.1 捕获异常 153
    7.1.2 Backtrace . 156
    7.1.3 重新抛出错误 159
    7.1.4 抛出你自己的异常 160
    7.1.5 定义你自己的异常类型 161
    7.2 Failure . 162
    7.3 警告 . 163
    7.4 关于异常的箴言 164
    7.5 小结 . 164
    第8 章 文件和目录、输入和输出 165
    8.1 文件路径 165
    8.1.1 文件测试操作符 167
    8.1.2 文件元数据 . 169
    8.1.3 链接文件和解除链接 . 171
    8.1.4 重命名和复制文件 173
    8.2 管理目录 174
    8.2.1 目录清单 175
    8.2.2 创建目录 176
    8.2.3 删除目录 177
    8.3 格式化输出 178
    常见格式化任务 180
    8.4 标准文件句柄 . 181
    8.4.1 标准输出 181
    8.4.2 标准错误 182
    8.4.3 标准输入 183
    8.5 读取输入 184
    8.5.1 读取行 184
    8.5.2 读取文件 185
    8.6 写输出 187
    打开一个要写的文件 . 187
    8.7 二进制文件 188
    8.7.1 移动 189
    8.7.2 写二进制文件 190
    8.8 小结 . 190
    第9 章 关联 191
    9.1 Pair 191
    9.1.1 副词 192
    9.1.2 修改Pair 193
    9.2 Map 194
    9.2.1 检查键 195
    9.2.2 从Positional 创建Map . 196
    9.2.3 检查可取值 . 197
    9.3 Hash . 198
    用散列累加. 200
    9.4 多级散列 202
    9.5 小结 . 203
    第10 章 使用模块 . 204
    10.1 安装模块 . 204
    10.2 加载模块 . 205
    10.2.1 查找模块 206
    10.2.2 词法作用 209
    10.2.3 运行时加载模块 210
    10.3 从Web 获取数据 213
    10.4 Perl 6 中运行Perl 5 213
    10.5 小结 214
    第11 章 子例程 . 215
    11.1 一个基本子例程 215
    11.1.1 额外参数 216
    11.1.2 显式返回 217
    11.2 递归 218
    使用迭代而不是递归 . 219
    11.3 子例程存储在库中 . 220
    导出子例程. 221
    11.4 位置参数 . 221
    11.4.1 Slurpy 参数 222
    11.4.2 二者兼得 224
    11.4.3 结合Slurpy 225
    11.4.4 可选和默认参数 . 226
    11.4.5 参数特性 227
    11.4.6 参数约束 228
    11.5 同名但签名不同 229
    11.5.1 字面量值参数 . 229
    11.5.2 实参个数 230
    11.5.3 参数类型 231
    11.6 命名参数 . 233
    11.6.1 必要命名参数 . 234
    11.6.2 自动的命名参数 . 234
    11.6.3 混合参数 235
    11.7 返回类型 . 236
    11.8 小结 237
    第12 章 类 238
    12.1 第一个类 . 238
    12.2 定义方法 . 240
    12.2.1 私有方法 240
    12.2.2 定义子例程 241
    12.3 对象 242
    12.3.1 私有属性 242
    12.3.2 公共属性 245
    12.4 multi 方法 246
    12.5 继承类型 . 248
    12.5.1 检查继承 250
    12.5.2 Stub 方法 251
    12.6 控制对象创建 251
    12.6.1 构建对象 253
    12.6.2 调整对象 255
    12.7 私有类 . 256
    12.8 小结 257
    第13 章 角色 . 258
    13.1 为类增加行为 258
    13.1.1 应用多个角色 . 260
    13.2 角色中的方法 261
    13.3 消除角色冲突 262
    13.4 匿名角色 . 264
    13.5 小结 266
    第14 章 Junction 和Set 267
    14.1 Junction 267
    14.1.1 any 267
    14.1.2 all 271
    14.1.3 one 272
    14.1.4 none . 273
    14.1.5 一些关于Junction 的技巧 . 273
    14.2 Set 274
    Set 操作 277
    14.3 小结 278
    第15 章 正则表达式 279
    15.1 匹配操作符 279
    15.1.1 匹配操作符语法 280
    15.1.2 成功匹配 281
    15.1.3 定义模式 282
    15.1.4 预定义模式 283
    15.2 匹配非字面量字符 . 285
    15.2.1 匹配任意字符 . 285
    15.2.2 字符的匹配类型 288
    15.2.3 用户自定义字符类 290
    15.3 匹配副词 . 293
    15.3.1 匹配大小写 293
    15.3.2 忽略标记 295
    15.3.3 全局匹配 295
    15.4 关于模式使用 296
    替换 297
    15.5 小结 297
    第16 章 更酷的正则表达式 298
    16.1 量词 298
    16.1.1 0 或多个. 299
    16.1.2 贪婪性 300
    16.1.3 0 或1 个. 300
    16.1.4 最小和最大 301
    16.2 控制量词 . 302
    关闭回溯 . 303
    16.3 捕获 304
    16.3.1 命名捕获 305
    16.3.2 捕获树 306
    16.3.3 反向引用 308
    16.4 包围符和分隔符 309
    16.5 断言 311
    16.5.1 锚 311
    16.5.2 条件 . 312
    16.5.3 代码断言 314
    16.6 候选项 . 316
    16.6.1 第一个匹配 316
    16.6.2 最长Token 匹配 318
    16.7 小结 320
    第17 章 文法 . 321
    17.1 一个简单的文法 321
    17.2 多个规则 . 325
    17.3 调试文法 . 326
    17.3.1 Grammar::Tracer 326
    17.3.2 Grammar::Debugger . 327
    17.4 一个简单的动作类 . 328
    创建一个抽象语法树 . 329
    17.5 避免回溯 . 331
    17.6 解析JSON . 332
    17.7 解析CSV 335
    17.7.1 调整文法 338
    17.7.2 文法中使用角色 339
    17.8 小结 340
    第18 章 Supply、Channel 和Promise 341
    18.1 Supply 341
    18.1.1 多个Tap 343
    18.1.2 现场Supply . 344
    18.2 Channel 346
    18.3 Promise 348
    18.3.1 等待Promise 349
    18.3.2 等待多个Promise . 350
    18.3.3 管理自己的Promise 351
    18.3.4 Promise Junction 353
    18.4 响应式编程 354
    在后台响应. 357
    18.5 小结 359
    第19 章 控制其他程序 361
    19.1 快速简便 . 361
    19.1.1 加引号的命令 . 363
    19.1.2 更安全的命令 . 363
    19.1.3 写到Proc 365
    19.2 Proc 366
    19.3 异步控制 . 367
    19.4 小结 368
    第20 章 高级主题 . 369
    20.1 单行程序 . 369
    20.2 声明符代码块注释 . 370
    20.3 Feed 操作符 370
    20.4 分解签名 . 371
    20.5 定义你自己的操作符  371
    20.6 Perl 5 模式 . 372
    20.7 异型数组 . 372
    20.8 有类型的容器 373
    20.9 NativeCall 373
    20.10 with 主题 374
    第21 章 结束语 . 375
    术语表 377
    附录 练习答案 391
    作者介绍 481
    封面介绍 481
  • 精彩书评

    “正如他在《Learning Perl》一书中对Perl语言的介绍, brian又用简洁、平实的文字解释了Perl 6语言。” ——chromatic Perl设计小组成员(2003-2011) “尽管多年来我一直在使用Perl 6,仍然能够从这本全面详尽的佳作中学到很多。如果初学这个语言时能有这样一本书,我的生活会轻松得多。” ——Laurent Rosenfeld 《Think Perl 6》作者
微信公众号

热门文章

更多