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
普通中缀 ^
运算符用于其他用途,这与大多数其他语言不同。其中带^
的运算符包括:
其中有几个中缀运算符带有^
,它们都是异或的意思。
^
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
创建了一个自我引用的值。这很好,直到您尝试使用或打印它。
使用 ^=
运算符时,程序永远不会终止,也不会产生结果。我做错了什么吗?
为了检查我是否可以重现这个,我使用了这个有效的、可验证的例子:
my $k = 1;
$k ^= 24;
say $k;
除此之外,我什至尝试这样做:$k = $k ^ 24;
- 但这仍然会产生同样的问题。
正如@melpomene 所建议的,我应该使用 infix +^
operator、 整数按位 异或运算符。
使用 <op>=
语法提高可读性,解决方案是:
my $k = 1;
$k +^= 24;
say $k
普通中缀 ^
运算符用于其他用途,这与大多数其他语言不同。其中带^
的运算符包括:
其中有几个中缀运算符带有^
,它们都是异或的意思。
^
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 最后一个值。如果有多个真实值,它就会短路 returnsNil
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
创建了一个自我引用的值。这很好,直到您尝试使用或打印它。