从语法doc:
后面的大括号后面跟一个换行符表示一个语句分隔符,这就是为什么你不需要在if语句块之后写一个分号.
if True {
say "Hello";
}
say "world";
Run Code Online (Sandbox Code Playgroud)
这很好,发生了什么为什么这个Perl 6饲料操作员是一个"虚假陈述"?.
但是,这个规则对于一个不受约束的人else如何运作?这是一个特例吗?
if True {
say "Hello";
}
else {
say "Something else";
}
say "world";
Run Code Online (Sandbox Code Playgroud)
或者,with-orwith示例如何:
my $s = "abc";
with $s.index("a") { say "Found a at $_" }
orwith $s.index("b") { say "Found b at $_" }
orwith $s.index("c") { say "Found c at $_" }
else { say "Didn't find a, b or c" }
Run Code Online (Sandbox Code Playgroud)
您找到的文档并不完全正确。该文档已更新并且现在是正确的。现在内容如下:
如果同一行上没有其他语句跟在块的右花括号 } 后面,则以裸块结尾的完整语句可以省略尾随分号。
...
对于属于同一 if/elsif/else(或类似)构造的一系列块,隐含分隔符规则仅适用于该系列的最后一个块的末尾。
原答案:
查看ifinnqp和Rakudo的语法,似乎一if/elsif/else组块被一起解析为一个控制语句。
if为nqprule statement_control:sym<if> {
<sym>\s
<xblock>
[ 'elsif'\s <xblock> ]*
[ 'else'\s <else=.pblock> ]?
}
Run Code Online (Sandbox Code Playgroud)
(https://github.com/perl6/nqp/blob/master/src/NQP/Grammar.nqp#L243,截至 2017 年 8 月 5 日)
if乐道中的规则rule statement_control:sym<if> {
$<sym>=[if|with]<.kok> {}
<xblock(so ~$<sym>[0] ~~ /with/)>
[
[
| 'else'\h*'if' <.typed_panic: 'X::Syntax::Malformed::Elsif'>
| 'elif' { $/.typed_panic('X::Syntax::Malformed::Elsif', what => "elif") }
| $<sym>='elsif' <xblock>
| $<sym>='orwith' <xblock(1)>
]
]*
{}
[ 'else' <else=.pblock(so ~$<sym>[-1] ~~ /with/)> ]?
}
Run Code Online (Sandbox Code Playgroud)
(https://github.com/rakudo/rakudo/blob/nom/src/Perl6/Grammar.nqp#L1450截至 2017 年 8 月 5 日)