perlsyn - Perl 语法
描述§
关于 perlsyn 文档中描述的语法元素,Perl 和 Raku 之间差异的(希望是)全面描述。
注意§
本文档不详细解释 Raku 语法。本文档旨在指导您从 Perl 的工作方式过渡到 Raku 中的等效内容。有关 Raku 语法的完整文档,请参见 Raku 文档。
自由格式§
Raku 仍然很大程度上是自由格式的。但是,在某些情况下,空格的存在或缺乏现在变得很重要。例如,在 Perl 中,您可以在关键字后省略空格(例如 while($x < 5)
或 my($x, $y)
)。在 Raku 中,需要该空格,因此 while ($x < 5)
或 my ($x, $y)
。然而,在 Raku 中,您可以完全省略括号:while $x < 5
。这适用于 if
、for
等。
奇怪的是,在 Perl 中,您可以在数组或哈希与其下标之间留空格,以及在后缀运算符之前留空格。所以 $seen {$_} ++
是有效的。不再。现在必须是 %seen{$_}++
。
如果您感觉更好,您可以使用反斜杠来“取消空格”,这样您就可以在原本禁止使用空格的地方使用空格。
有关详细信息,请参阅 空格。
声明§
如 函数 指南中所述,Raku 中没有 undef
。已声明但未初始化的标量变量将评估为其类型。换句话说,my $x;say $x;
将为您提供“(Any)”。my Int $y;say $y;
将为您提供“(Int)”。
注释§
#
开始一个注释,该注释一直运行到行尾,就像在 Perl 中一样。
嵌入式注释以一个井号和一个反引号 (#`
) 开头,后面跟着一个开括号,并一直持续到匹配的闭括号。就像这样
if #`( why would I ever write an inline comment here? ) True
与 Perl 一样,您可以使用 pod 指令来创建多行注释,在注释之前使用 =begin comment
,在注释之后使用 =end comment
。
真值和假值§
Perl 真值和 Raku 真值之间唯一的区别是,与 Perl 不同,Raku 将字符串 "0"
视为真值。数字 0
仍然为假,您可以使用前缀 +
将字符串 "0"
强制转换为数字,使其变为假。此外,Raku 具有实际的布尔类型,因此,在许多情况下,True 和 False 可能对您可用,而无需担心哪些值算作真值和假值。
语句修饰符§
大多数情况下,语句修饰符仍然有效,但也有一些例外。
首先,for
循环专门是 Perl 中称为 foreach
循环的内容,而 for
在 Raku 中不用于 C 样式的 for
循环。要获得该行为,您需要 loop
。loop
不能用作语句修饰符。
在 Raku 中,您不能使用 do {...} while $x
形式。您需要用 repeat
替换该形式中的 do
。类似地,对于 do {...} until $x
。
复合语句§
与 Perl 的最大区别在于,given
在 Raku 中不是实验性的,也不是默认禁用的。有关 given
的详细信息,请参阅 此页面。
循环控制§
next
、last
和 redo
从 Perl 到 Raku 没有改变。
但是,continue
在 Raku 中不存在。您将在循环体中使用 NEXT
块。
# Perl
my $str = '';
for (1..5) {
next if $_ % 2 == 1;
$str .= $_;
}
continue {
$str .= ':'
}
# Rakumy = '';for 1..5
For 循环§
如上所述,C 样式的 for
循环在 Raku 中不称为 for
循环。它们只是 loop
循环。要编写无限循环,您不需要使用 C 惯用的 loop (;;) {...}
,而可以省略规范:loop {...}
Foreach 循环§
在 Perl 中,for
除了用于 C 样式的 for
循环之外,还是 foreach
的同义词。在 Raku 中,for
仅用于 foreach
样式的循环。
Switch 语句§
Raku 具有实际的 switch 语句,由 given
提供,各个情况由 when
和 default
处理。基本语法是
given EXPR { when EXPR { ... } when EXPR { ... } default { ... } }
完整的详细信息可以在 此处 找到。
Goto§
goto
目前尚未实现。标签 **已** 实现,可作为 next
、last
和 redo
的目标。
FOO: # Labels end with colons, like in Perlfor ^10# outer for before# inner for
有关 goto
的计划,请参阅 https://design.raku.org/S04.html#The_goto_statement。
省略号语句§
...
(以及 !!!
和 ???
)用于创建存根声明。这比 Perl 中使用 ...
稍微复杂一些,因此您可能需要查看 https://design.raku.org/S06.html#Stub_declarations 以了解详细内容。也就是说,尽管 ...
在 Raku 中的作用得到了扩展,但似乎没有明显的理由说明它不能继续在 Perl 中发挥作用。
POD:嵌入式文档§
Pod 在 Perl 和 Raku 之间有所改变。可能最大的区别是您需要将 pod 包含在 =begin pod
和 =end pod
指令之间。还有一些细微的调整。
为了调试,您最好的选择可能是使用 Raku 解释器检查您的 pod。您可以使用 --doc
开关来实现。例如 raku --doc Whatever.pod
。这将把任何问题输出到标准错误。
有关 Raku 风格 pod 的详细信息,请访问 此处。