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。这适用于 iffor 等。

奇怪的是,在 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 {
    say "something stupid";
}

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

真值和假值§

Perl 真值和 Raku 真值之间唯一的区别是,与 Perl 不同,Raku 将字符串 "0" 视为真值。数字 0 仍然为假,您可以使用前缀 + 将字符串 "0" 强制转换为数字,使其变为假。此外,Raku 具有实际的布尔类型,因此,在许多情况下,True 和 False 可能对您可用,而无需担心哪些值算作真值和假值。

语句修饰符§

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

首先,for 循环专门是 Perl 中称为 foreach 循环的内容,而 for 在 Raku 中不用于 C 样式的 for 循环。要获得该行为,您需要 looploop 不能用作语句修饰符。

在 Raku 中,您不能使用 do {...} while $x 形式。您需要用 repeat 替换该形式中的 do。类似地,对于 do {...} until $x

复合语句§

与 Perl 的最大区别在于,given 在 Raku 中不是实验性的,也不是默认禁用的。有关 given 的详细信息,请参阅 此页面

循环控制§

nextlastredo 从 Perl 到 Raku 没有改变。

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

# Perl
my $str = '';
for (1..5) {
    next if $_ % 2 == 1;
    $str .= $_;
}
continue {
    $str .= ':'
}

# Raku 
my $str = '';
for 1..5 {
    next if $_ % 2 == 1;
    $str ~= $_;
    NEXT {
        $str ~= ':'
    }
}

For 循环§

如上所述,C 样式的 for 循环在 Raku 中不称为 for 循环。它们只是 loop 循环。要编写无限循环,您不需要使用 C 惯用的 loop (;;) {...},而可以省略规范:loop {...}

Foreach 循环§

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

Switch 语句§

Raku 具有实际的 switch 语句,由 given 提供,各个情况由 whendefault 处理。基本语法是

given EXPR {
    when EXPR { ... }
    when EXPR { ... }
    default { ... }
}

完整的详细信息可以在 此处 找到。

Goto§

goto 目前尚未实现。标签 **已** 实现,可作为 nextlastredo 的目标。

FOO:                         # Labels end with colons, like in Perl 
for ^10 {
    say "outer for before";
    for ^10 {
        say "inner for";
        last FOO;
    }
    say "outer for after";   # Will not show because of the "last" 
}
# 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 的详细信息,请访问 此处