代码之家  ›  专栏  ›  技术社区  ›  madcrazydrumma

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

  •  10
  • madcrazydrumma  · 技术社区  · 6 年前

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

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

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

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

    2 回复  |  直到 6 年前
        1
  •  8
  •   Brad Gilbert    6 年前

    有几个中缀运算符 ^ 在它们中,所有这些都意味着排他性或某种形式的排他性。

    • ^ 连接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 要把交叉口弄垮,你应该尽快这样做。

    • ^^ 短路异或。返回唯一的truish值。如果没有trush值,则返回最后一个值。如果有多个trueish值,它会短路并返回 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的位,返回的值有 1 如果其中一个整数有 1个 在那个位置

      say (0b10101010 +^ 0b10100000).base: 2; # 1010
      
      say 1.5 +^ 2; # 3
      
    • ~^ 字符串按位异或。一样做 +^ 除了在弦上。

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

    使用Perl 5 ^ 对于两者 +^ ~^ 取决于给定的值。如果您选择使用较新的版本,它们有单独的运算符。


    代码没有停止的原因是 ^ 跟踪价值的来源。

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

    那么 $k ^= 24 创建自引用值。这是好的,直到你尝试使用,或打印它。

        2
  •  6
  •   raiph    6 年前

    正如@melpomene所建议的,我应该使用 infix +^ operator ,和 按位整数 独家或运营商。

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

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

    简单的中缀 ^ 运算符用于其他语言,与大多数其他语言不同。运算符 ^ 其中包括:

    • Prefix +^ 按位进行整数运算 否定 (二)

    • Infix ^^ 是否短路 布尔型 排除或;

    • Prefix ^ 是范围构造函数;

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