When using the
^= operator, the program never terminates and it doesn't produce a result. Am I doing something wrong?
To check that I could reproduce this I used this working, verifiable example:
my $k = 1; $k ^= 24; say $k;
As well as this, I even tried doing:
$k = $k ^ 24; - but this still produces the same issue.
There are several infix operators with
^ in them, all of them mean exclusive-or in some form.
^Junctive xor, which is trueish if exactly one value is trueish. It is a value that can be passed around.
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
soto collapse the junction, which you should do as soon as practical.
^^Short circuiting xor. Returns the only truish value. If there is no truish value it returns the last value. If there is more than one trueish value it short circuits and returns
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 bitwise xor. It compares the bits of two Ints and the value it returns has a
1if exactly one of the Ints has a
1in that position
say (0b10101010 +^ 0b10100000).base: 2; # 1010 say 1.5 +^ 2; # 3
~^String bitwise xor. Does the same as
+^except on strings.
say 'aa' ~^ 'US'; # 42
Perl 5 used
^ for both
~^ depending on what values it was given. Newer versions have separate operators for those if you opt-into using them.
The reason your code doesn't halt is that a Junction created with
^ keeps track of where the value came from.
my $k = 1; my $v = $k ^ 24; say $v; # one(1, 24); $k = 2; say $v; # one(2, 24);
$k ^= 24 creates a self-referential value. Which is fine, until you try to use, or print it.