Perl 6'^ ='运算符未产生结果,导致程序永不终止

时间:2018-07-15 08:11:09

标签: perl6 raku

使用^=运算符时,程序永远不会终止,也不会产生结果。我在做错什么吗?

为了检查是否可以重现,我使用了这个可验证的示例:

my $k = 1;
$k ^= 24;
say $k;

除此之外,我什至尝试做:$k = $k ^ 24;-但这仍然会产生相同的问题。

2 个答案:

答案 0 :(得分:8)

其中有几个带有^的中缀运算符,它们都表示互斥或某种形式。

  • ^逻辑异或,如果恰好一个值为真,则为真。这是一个可以传递的值。

    so     1 == 1 ^ 2; # True
    so     2 == 1 ^ 2; # True
    so    42 == 1 ^ 2; # False
    so 1 ^ 2 == 1 ^ 2; # False
    
    my $v = 1 ^ 2;
    so 1 == $v; # True
    

    我添加了so来折叠结,您应该在实际可行的情况下尽快这样做。

  • ^^异或短路。返回唯一的truish值。如果没有稳定值,则返回最后一个值。如果有多个真实值,它将短路并返回Nil

    say ( 0 ^^ 42 ^^ Nil );
    42
    
    say ( !say(1) ^^ !say(2) ^^ -1 but False );
    1
    2
    -1
    
    say ( say(1) ^^ say(2) ^^ say(3) );
    1
    2
    Nil
    
  • +^整数按位异或。它比较两个整数的位,如果正好其中一个整数在该位置具有1,则它返回的值将为1

    say (0b10101010 +^ 0b10100000).base: 2; # 1010
    
    say 1.5 +^ 2; # 3
    
  • ~^字符串按位异或。与+^相同,只是字符串不同。

    say 'aa' ~^ 'US'; # 42
    

Perl 5对^+^使用了~^,具体取决于给出的值。如果您选择使用较新的版本,则为它们使用单​​独的运算符。


您的代码没有停止的原因是,使用^创建的Junction跟踪值的来源。

my $k = 1;
my $v = $k ^ 24;
say $v; # one(1, 24);

$k = 2;
say $v; # one(2, 24);

因此,$k ^= 24将创建一个自引用值。没问题,除非您尝试使用或打印它。

答案 1 :(得分:6)

如@melpomene所建议,我应该使用infix +^ operator按位整数异或运算符)。

使用<op>=语法以提高可读性,解决方案是:

my $k = 1;
$k +^= 24;
say $k

与其他大多数语言不同,普通infix ^运算符用于其他功能。其中带有^的运算符包括:

  • Prefix +^进行按位整数求反;

  • Infix ^^短路 boolean 异或;

  • Prefix ^是范围构造函数;

  • Infix ^是一个“一个”联结构造函数(这是我所提问题中的代码所调用的)。