一说到Perl 6,就得和Perl 5比较,Perl 5 在 feature 中加入了switch等方便的控制流,但是如果用“方便”来形容Perl 5, Perl 6就可以说成“灵活多变”,像Python的list/dict/set generator,而Perl 6 把所有的控制流都变成了Python 有的generator了,灵活的像Water Dance 。
需要注意:
- 语句块末尾可以加
;
,变成语句执行 - 控制流都可以返回值,而且即使倒置结构也可以用 block 了
- Perl 5只能正常的用block,倒置的只能用单语句
- 新加了 with without orwith
- 把 for 拆成了 for 和 loop
语句块
{...}; #后面可以加; 这样就成了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 用()括起来得到返回值
没有do 和 while这样的组合了
#可以用
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连用