Backup: Flow Control in Perl6

Control Flow

注意空格,注意空格,注意空格
和 Perl5不同的是,这些结构都可以返回值,而且即使倒置结构也可以用 block 了
block 可以有逗号
with without orwith

{...}; #后面可以加; 这样就成了statement,会被立即执行;默认是不会立即执行的

do {...}; #do可以让block立即执行,并和sub/method一样返回最后执行的语句
#do的block也只有需要返回值的时候才被执行
#do也可以在没有{}的情况用,只有是一个 expression 最后的部分

quietly {};
#warnings 不会烦人地显示的

once {};
#只运行一次,即使在 loop 中也一样一次

#------------
#循环
#------------
for @LIST -> $item {...}
# -> $item 可以省略,默认是用$_,而且同样可以省略
for @LIST.kv -> $idx, $val {...}
for %HASH.kv -> $key, $val {...}
for @LIST <-> $_ {...}
#这样$_就可读可写了,默认是只可读
#同样可以把 for loop 用()括起来得到返回值
my @a = (for 1,2,3 { $_ * 2 });
my @a = do for 1,2,3 { $_ * 2 };

#有爱的一点就是把 C 语言格式的 for loop 换成了
loop (my $i = 0; $i < 10; $i++) {...}
#同样可以把 loop loop 用()括起来得到返回值

while True/False {...}
until True/False {...}
{...} while True/False
{...} until True/False
#同样可以把 while/until loop 用()括起来得到返回值
# do {...} while True/False;不能用
#可以用
repeat {...} while True/False;
repeat {...} until True/False;
#和 Perl5 一样也有 next/last/redo

#------------
#条件
#------------
if True/False {...} #condition 部分也不必要()了
{...} if True/False # statement modifier form。Perl5中不能用 block
(if True/False {...})
({...} if True/False)
#要么返回 last evaluated,要么空 list
if True/False {...} else {...}
if True/False {...} elsif {...} else {...}
#else 任何时候都是可以没有的
#不能像 Python 中那样 {...} if True/False else {...}
#多可以用()括起来得到返回值
#有一点不可思议的是,
#else 可以获取上一个执行的 if/elsif 的值,格式是
if {} else -> $a {...}
#$a就是上次执行的 if block 的结果
unless True.False {...}
#不能有 else/elsif,可以用
{} unless True/False

given EXPR {
    when EXPR { ... }
    when EXPR { ... }
    default { ... }
}
given EXPR {...}
{...}(EXPR)
#和 for 一样也是使用$_,同样可以没有when/default
#注意 when 的顺序
#用proceed 表示立即退出当前 when/default,继续后续的 when/default,但不会退出 given
#用succeed 表示立即退出 given 块
#同样可以把 given block 用()括起来得到返回值

#此外还有一些
with expression {...}
orwith expression {...}
without expression {...}
#和 if 一样,但会检查 expression 是否定义
#上面的分别和 if elsif unless 对应

gather { take ...; ...}
#有点多选项的意思,只要满足条件就返回,对返回个数没有限制
# generate values lazily
# scoped dynamically
#上面的这两个点 so lazy

#------------
#LABEL
#------------
#while/until/for loop 可以有 LABEL,可以和 redo/next/last 一起使用
#当然也可以 goto 啦

posted @ 2016-06-01 20:54  乌祁班岚图  阅读(138)  评论(0编辑  收藏  举报