新書推薦:
《
大单元教学设计20讲
》
售價:HK$
76.2
《
儿童自我关怀练习册:做自己最好的朋友
》
售價:HK$
69.4
《
高敏感女性的力量(意大利心理学家FSP博士重磅力作。高敏感是优势,更是力量)
》
售價:HK$
62.7
《
元好问与他的时代(中华学术译丛)
》
售價:HK$
87.4
《
汽车传感器结构·原理·检测·维修
》
售價:HK$
109.8
《
怪谈百物语:不能开的门(“日本文学史上的奇迹”宫部美雪重要代表作!日本妖怪物语集大成之作,系列累销突破200万册!)
》
售價:HK$
65.0
《
罗马政治观念中的自由
》
售價:HK$
50.4
《
中国王朝内争实录:宠位厮杀
》
售價:HK$
61.6
編輯推薦:
不论你是一名程序员、系统管理员,还是Web黑客,如果刚开始学习Raku(以前叫作Perl 6),那么这本书正是你需要的。Raku是一种新语言,它是Perl语言的重生之作,可以用于几乎所有任务,从小的修修补补到完整的Web应用都适用。这本实用教程将带领你入门。
本书作者(同时也是《Mastering Perl》的作者)为这种新的编程语言提供了全面详尽的介绍。这本指南的每一章都包含一些练习,帮助你边学边用,实践新学习的知识。其他书可能只会单纯地教你如何用Raku编程,这本书则会让你成为一名真正的Raku程序员。
內容簡介:
本书内容包括:
数字、字符串、代码块和positional。 文件、目录和输入输出。 关联、子例程、类和角色。 junction和set。 正则表达式和内置文法。 并发特性:promise、supply和channel。 控制外部程序和其他高级特性。
關於作者:
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
內容試閱 :
前言
欢迎阅读本书第一版,如果你读过我写的其他一些书,这个书名看起来可能有些似曾相识。不过,这确确实实是我写的有关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 CompilerGHC 上实现了Perl 6。她把它称为Pugs(Perl 6 Users 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.ionewperl6)和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 下载。
这本书的目的是帮助你完成工作。一般来讲,你可以在你的程序和文档中使用这些代码,不需要联系我们来得到许可,除非你直接复制了大部分的代码。例如,如果你在编写一个程序,使用了本书中的多段代码,这并不需要得到许可,但是出售或发行OReilly 书示例代码光盘则需要得到许可。回答问题时如果引用了这本书的文字和示例代码,不需要得到许可,但是如果你的产品文档借用了本书中的大量示例代码,则需要得到许可。
我们希望但不严格要求标明引用出处。引用信息通常包括书名、作者、出版商和ISBN。例如Learning Perl 6 by brian d foyO''Reilly. Copyright 2018 brian d foy, 978-1-491-97768-2。
如果你认为你在使用代码示例时超出了合理使用范围或者上述许可范围,可以随时联系我们:permissions@oreilly.com。
OReilly 在线学习平台(OReillyOnline Learning)
近40 年来,OReillyMedia 致力于提供技术和商业培训、知识和卓越见解,来帮助众多公司取得成功。
我们拥有独一无二的专家和革新者组成的庞大网络,他们通过图书、文章、会议和我们的在线学习平台分享他们的知识和经验。OReilly 的在线学习平台允许你按需访问现场培训课程、深入的学习路径、交互式编程环境,以及OReilly 和200 多家其他出版商提供的大量文本和视频资源。有关的更多信息,请访问http:oreilly.com。
意见和疑问
对本书的评价和疑问请寄至出版社:
美国:
OReillyMedia, Inc.