Perl 6 控制流:Control Flow

2017-08-30  本文已影响0人  喷射的熔浆

一说到Perl 6,就得和Perl 5比较,Perl 5 在 feature 中加入了switch等方便的控制流,但是如果用“方便”来形容Perl 5, Perl 6就可以说成“灵活多变”,像Python的list/dict/set generator,而Perl 6 把所有的控制流都变成了Python 有的generator了,灵活的像Water Dance 。

需要注意:

语句块

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

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

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

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

for循环

# -> $item 可以省略,默认是用$_
for @LIST -> $item {...}
# $_同样可以省略
for @LIST {...}

# 数组
for @LIST.kv -> $idx, $val {...}
# 哈希
for %HASH.kv -> $key, $val {...}

# <->在 ->的基础上加了一个<,表示可读可写
for @LIST <-> $_ {...}
#这样$_就可读可写了,默认->是只可读

#可以把 for 控制流用 () 括起来得到返回值
my @a = (for 1,2,3 { $_ * 2 });
my @a = do for 1,2,3 { $_ * 2 }; # do 就相当于那对括号

# C 语言格式变成了
loop (my $i = 0; $i < 10; $i++) {...}
# 同样可以把 loop loop 用()括起来得到返回值
my @b = (loop(my $i = 0; $i < 3; $i++){ $a[$i] * 2});

while

while True/False {...}
until True/False {...}
{...} while True/False
{...} until True/False
# 可以把 while/until loop 用()括起来得到返回值

没有dowhile这样的组合了

#可以用
repeat {...} while True/False;
repeat {...} until True/False;
# 和 Perl5 一样也有 next/last/redo

If

# condition 部分没必要()起来,像Apple Swift语言
if True/False {...} 

# Perl5中支持的开始支持了
{...} if True/False # statement modifier form。

# 可以把if 用()括起来得到返回值
(if True/False {...})
({...} if True/False)
#要么返回最后执行的语句的值,要么空 list

# else/elsif块
if True/False {...} else {...}
if True/False {...} elsif {...} else {...}
#else 任何时候都是可以没有的
#不能像 Python 中那样 {...} if True/False else {...}

# 可以用()括起来得到返回值
$ok = (if True/False {...} else {...});

#### 有一点不可思议的是,
# else 可以获取上一个执行的 if/elsif 的值,格式是
if {} else -> $a {...}
# $a就是上次执行的 if block 的结果

# unless语句,不能有 else/elsif
unless True/False {...}
# 可以用倒置语句块
{} unless True/False

switch/case语句流,Perl 5中的feature

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/orwith/without

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

gather/take

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

LABEL

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

Reference

  1. Control Flow in Perl6
上一篇 下一篇

猜你喜欢

热点阅读