Category: Perl6 Keywords: junction Perl6
Preface
junction, 中文可以翻译成结。强大得你会立刻爱上它。Examples
先举几个例子:- 判断 $a 要么等于 1 要么等于 2 要么等于 3 ....
# Perl 5 if ($a == 1 || $a == 2 || $a == 3 || ....) {# Perl 6 if $a = 1|2|3|.. { - 判断 $a $b 都不等于 $c $d (两个用 Perl 5 写还不算麻烦,但十个呢?)
# Perl 5 if ($a != $c) && ($a != $d) && ($b != $c) && ($b != $d) {# Perl 6 if all($a, $b) == none($c, $d) { - 判断一个文件存在,然后大小不为零,可读可写(这个不是 junction)
# Perl 5 if (-e $_ && -s $_ && -r $_ && -w $_) {# Perl 6 if -e -s -r -w $_ { - 判断数组 @a 中的任意元素都不在 @b 中(不是说 Perl 5 中无法实现,要用 %hash 来曲线救国),Perl 6 中用 junction 就很简单:
if any(@a) ne any(@b) { - 判断数组 @a 中只有一个元素在 @b 中:(听起来非常像集合的运算,并,交,补,包含等)
if one(@a) eq one(@b) { - 一个变量不是对象 A 也不是对象 B 也不是对象 C,或定义一个变量不是 Dog 就是 Cat.
if $a ~~ none(A|B|C) { my Dog|Cat $pet;
详细描述
junction 其实是将一些数据值叠加,表现为一个数据值。junction 有四种形式:
| 列表操作符 | 中缀(infix)操作符 | 关系 | 简单解释 |
| all | & | AND | 所有的值必须都为 true |
| any | | | OR | 至少有一个值为 true |
| one | ^ | XOR | 有且仅有一个值为 true |
| none | NOT | 所有的值都得为 flase |
注意中缀操作符是列表相关("list-associative")的:
$a | $b | $c 与 any($a,$b,$c) 同,而不是 any(any($a,$b),$c) $a & $b & $c 与 all($a,$b,$c) 同,而不是 all(all($a,$b),$c) $a ^ $b ^ $c 与 one($a,$b,$c) 同,而不是 one(one($a,$b),$c)
junction 与 向量操作符 有点类似。不同的是 junction 大多运行在判断正确与否里。
我们还是用例子来说明 junction 的运算:$junc = any(1, 2); $junc += 5; # $junc is now any(6, 7)
- junction 方法:
- 我们用 .values 将 junction 展平为列表:(这种情况下或许向量操作符看起来更清晰点)
my $junc = all(1, 2, 3); # create a junction my $sums = $junc + 3; # add 3 my @set = $sums.values(); # (4, 5, 6)
- 我们用 dump 来输出某一 junction 的结构:
$string = $sums.dump( ); # $string = "all(4,5,6)"
- pick 只能从 any 或只有一个值的 one 里取得随机值,对于 all, none 和多于一个值的 one, 返回 undef
my $junc = any(1, 2, 3); say $junc.pick(); # may be 1, 2, or 3 my $junc = all(1, 2, 3); # none is the same as all say $junc.pick(); # undef my $junc = one(1, 2, 3); say $junc.pick(); # undef my $junc = one(1); say $junc.pick(); # 1