使用^=
运算符时,程序永远不会终止,也不会产生结果。我在做错什么吗?
为了检查是否可以重现,我使用了这个可验证的示例:
my $k = 1;
$k ^= 24;
say $k;
除此之外,我什至尝试做:$k = $k ^ 24;
-但这仍然会产生相同的问题。
答案 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 ^
运算符用于其他功能。其中带有^
的运算符包括: