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

Perl 6 '^=' operator doesn't produce a result, causing program to never terminate

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

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

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

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

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

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

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

普通中缀 ^ 运算符用于其他用途,这与大多数其他语言不同。其中带^的运算符包括:

  • Prefix +^ 按位取整数 求反;

  • Infix ^^ 进行短路 boolean exclusive-OR;

  • Prefix ^是范围构造函数;

  • Infix ^ 是一个 "one" 连接构造函数(这是我问题中的代码所调用的)。

其中有几个中缀运算符带有^,它们都是异或的意思。

  • ^ Junctive xor,如果正好有一个值是 trueish,则它是 trueish。这是一个可以传递的值。

    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 来折叠连接,您应该尽快这样做。

  • ^^ 异或短路。 Returns 唯一真实值。如果没有真实值,它 returns 最后一个值。如果有多个真实值,它就会短路 returns 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
    
  • +^ Int 按位异或。它比较两个 Int 的位和它的值 returns 有一个 1 如果恰好有一个 Int 在那个位置有一个 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 创建了一个自我引用的值。这很好,直到您尝试使用或打印它。