我从Day 10 – Feed operators of the Perl 6 2010 Advent Calendar开始使用此示例,而.uc
稍微更改.ucfirst
已不再存在:
my @rakudo-people = <scott patrick carl moritz jonathan jerry stephen>;
@rakudo-people
==> grep { /at/ } ==> map { .uc } ==> my @who-it's-at;
say ~@who-it's-at;
我用一些额外的空格稍微改写一下:
my @rakudo-people = <scott patrick carl moritz jonathan jerry stephen>;
@rakudo-people
==> grep { /at/ }
==> map { .uc } ==> my @who-it's-at;
say ~@who-it's-at;
现在它是一个虚假陈述&#34;:
===SORRY!=== Error while compiling ... Bogus statement ------> ==> grep { /at/ }⏏<EOL> expecting any of: postfix prefix statement end term
这个例子不是问题。当前文档中的一些示例可以表现出相同的行为。
如果我在违规行的末尾添加unspace,则会再次有效:
my @rakudo-people = <scott patrick carl moritz jonathan jerry stephen>;
@rakudo-people
==> grep { /at/ } \
==> map { .uc } ==> my @who-it's-at;
say ~@who-it's-at;
奇怪的是,该行末尾的注释不起作用。我原以为它会吃掉那些令人讨厌的空白。
如果例程/方法采用单个参数或第一个参数是块,则通常需要使用括号调用
有效:
my @rakudo-people = <scott patrick carl moritz jonathan jerry stephen>;
@rakudo-people
==> grep( { /at/ } )
==> map { .uc } ==> my @who-it's-at;
say ~@who-it's-at;
但为什么第一种形式的问题不是?在这里做什么空白?什么情况包含在&#34;经常需要&#34;?
答案 0 :(得分:9)
来自Separating Statements上的Perl 6文档:
结束花括号后跟换行符表示语句分隔符
换句话说,每当块的右括号是行中的最后一个(不包括空格和注释)时,解析器就会在其后隐式插入分号。
这允许我们在<nav>
<a href="#home">
<h1>Brillian.</h1>
</a>
<ul>
<li>
<a href="#home">Home</a>
</li>
<li>
<a href="javascript:void">Portfolio</a>
</li>
<li>
<a href="blog.html">Blog</a>
</li>
<li>
<a href="#about">About</a>
</li>
<li>
<a href="contact.html">Contact</a>
</li>
<li>
<a href=""><i class="fa fa-search" aria-hidden="true"></i></a>
</li>
</ul>
</nav>
之后编写如下内容而不使用分号:
}
分号在那里会很难看,如果你先把循环写成my @foo = @bar.map: {
...
}
,然后决定把它变成for @bar { ... }
这样的赋值,那么添加尾随分号会很烦人,容易忘记。因此,在大多数情况下,这种自动语句在行尾结束后终止是有帮助的。
然而,喂食操作员的饲料操作员是一种情况(可能是唯一的一种),它会使人们绊倒。
为了防止它发生,请在阻止后插入map
(a.k.a。unspace),如您所知。 unspace使包含换行符的空白对解析器不可见,因此上述基于换行的解析器规则不会被应用。