Raku 语法

描述

关于 Perl 5 和 Raku 之间差异的全面(希望)描述。

注意

我*不会*详细解释 Raku 语法。本文档旨在指导你从 Perl 5 中的工作原理过渡到 Raku 中的等效工具。有关 Raku 语法的完整文档,请参阅 Raku 文档。

自由形式

Raku 仍然*主要是*自由形式。但是,有一些情况下,空白的存在或缺失现在很重要。例如,在 Perl 5 中,你可以省略关键字后面的空格(例如 while($x < 5)my($x, $y))。在 Raku 中,这个空白是必需的,因此 while ($x < 5)my ($x, $y)。但是,在 Raku 中,你可以完全省略括号:while $x < 5 `。这适用于 `iffor 等等。

奇怪的是,在 Perl 5 中,你可以在数组或散列与其下标之间以及后缀运算符之间留出空格。所以 $seen {$_} ` 是有效的。Raku 再不这样了。Raku 中现在必须是 `%seen{$_}

如果能让你感觉更好,你可以使用反斜杠来 “unspace” 空格,这样你就可以使用空格,否则它将被禁止。

有关详细信息,请参阅空白

声明

正如函数 指南中所述,Raku 中没有 undef 。声明但未初始化的标量变量将计算其类型。换句话说,my $x;say $x; 会给你”(Any)”。my Int $y;say $y; 会给你”(Int)”。

注释

# 在 Perl 5 中开始一个运行到行尾的注释。

嵌入式注释以井号字符和反引号开头,后跟开口括号字符,并持续到匹配的闭合括号字符。像这样:

  1. if #`( why would I ever write an inline comment here? ) True {
  2. say "something stupid";
  3. }

与 Perl 5 一样,你可以使用 pod 指令在注释 =begin comment 之前和 =end comment 之后创建多行注释。

真和假

Perl 5 与 Raku 之间的一个真正区别在于,与 Perl 5 不同,Raku 将字符串`“0”` 视为真。数字 0 仍为 false,你可以使用前缀 + 将字符串 "0" 强制转换为数字以使其为 false。Raku 还具有实际的布尔类型,因此,在许多情况下,你可以使用 TrueFalse,而无需担心哪些值计为 true 和 false。

语句修饰符

大多数情况下,语句修饰符仍然有效,但有一些例外。

首先,for 循环是 Perl 5 中已知的 foreach 循环,C 风格的 for`循环不用于 Raku。要获得该行为,你需要 `looploop 不能用作语句修饰符。

在 Raku 中,你无法使用 do {…​} while $x 形式。你将需要用 repeat 替换 do 形式。do {…​} until $x 类似。

复合语句

Perl 5 的最大变化是 given 在 Raku 中默认不是实验性质的或禁用的了。有关 given 的详细信息,请参阅此页面

循环控制

nextlastredo 在 Perl 5 到 Raku 中没有变化。

但是 continue,在 Raku 中不存在。你将在循环体中使用 NEXT 块。

  1. # Perl 5
  2. my $str = '';
  3. for (1..5) {
  4. next if $_ % 2 == 1;
  5. $str .= $_;
  6. }
  7. continue {
  8. $str .= ':'
  9. }
  10. # Raku
  11. my $str = '';
  12. for 1..5 {
  13. next if $_ % 2 == 1;
  14. $str ~= $_;
  15. NEXT {
  16. $str ~= ':'
  17. }
  18. }

For 循环

如上所述,C 风格的 for 循环在 Raku 中不称为 for 循环。它们只是 loop 循环。要编写无限循环,你不需要使用C语言风格的 loop (;;) {…​},只是完全省略规范:loop {…​}

Foreach 循环

在 Perl 5 中,for 除了用于 C 风格的 for 循环之外,它还是`foreach` 的同义词。在 Raku 中,for 仅用于 foreach 样式的循环。

Switch 语句

Raku 具有真实的 switch 语句,通过提供 given 与由处理的单个情况的 whendefault。基本语法是:

  1. given EXPR {
  2. when EXPR { ... }
  3. when EXPR { ... }
  4. default { ... }
  5. }

完整的细节可以在这里找到。

Goto

goto 目前尚未实施(尚未)。标签实现,可用作 nextlastredo 的目标:

  1. FOO: # Labels end with colons, like in Perl 5
  2. for ^10 {
  3. say "outer for before";
  4. for ^10 {
  5. say "inner for";
  6. last FOO;
  7. }
  8. say "outer for after"; # Will not show because of the "last"
  9. }
  10. === outer for before
  11. === inner for

有关 goto 的计划,请参阅 <https://design.raku.org/S04.html#The_goto_statement>。

省略语句

…​(以及 !!!???)用于创建存根(stub)声明。这比 Perl 5 中使用的 …​ 要复杂得多,所以你可能想要查看 https://design.raku.org/S06.html#Stub_declarations 以了解详细信息。尽管如此,尽管它在 Raku 中的作用得到了扩展,但它似乎还没有*明显的*理由说明它为什么不能完成它在 Perl 5 中所扮演的角色。

PODs: 嵌入式文档

Pod 已经在 Perl 5 和 Raku 之间发生了变化。可能最大的区别在于你需要将你的 pod 放在 =begin pod=end pod 指令之间。这里和那里也有一些调整。例如,正如我在编写这些文档时发现的那样,垂直条(|)在 X<> 代码中很重要,并且不清楚如何将字面 | 插入他们。你最好的选择可能是使用 Raku 解释器检查你的 pod。你可以使 --doc 开关执行此操作。例如 raku --doc Whatever.pod。这将输出任何问题到标准错误。(根据你安装 raku 的方式/位置,你可能需要指定 Pod::To::Text 的位置。)有关 Raku 样式 pod 的详细信息,请访问 <https://design.raku.org/S26.html>。