|
|
Subscribe / Log in / New account

Logical XOR

Logical XOR

Posted Jun 10, 2024 16:53 UTC (Mon) by jccleaver (guest, #127418)
In reply to: Logical XOR by rweikusat2
Parent article: perl v5.40.0 released

As syntactic sugar, it's helpful for clearing up a few logic flows. While it'll be a while before one could say this will be *clearer*, once folks are familiar with it it will let you make more legible lines.


to post comments

Logical XOR

Posted Jun 10, 2024 17:19 UTC (Mon) by pbonzini (subscriber, #60935) [Link] (6 responses)

But why can't you use == or != for logical XNOR and XOR respectively? XOR and XNOR can't be short-circuited anyway.

Logical XOR

Posted Jun 10, 2024 18:20 UTC (Mon) by smurf (subscriber, #17840) [Link] (3 responses)

Comparison isn't sufficient, you also need to bool-ize one or both values. The Perl-ish way of writing "x xor y" was "!x != !y" which is … meh.

On the other hand, I haven't programmed anything Perl-ish for the last 15 years, so what do I know?

Logical XOR

Posted Jun 10, 2024 19:33 UTC (Mon) by mathstuf (subscriber, #69389) [Link]

Why not learn something from Haskell and make it applicative so you can say something like `!*(x = y)` that applies the `!` operator to each token in the inside of the parenthesized expression? Of course, being Perl, maybe this will be adopted too ;) . Or it already has meaning?

Logical XOR

Posted Jun 10, 2024 20:21 UTC (Mon) by rweikusat2 (subscriber, #117920) [Link] (1 responses)

Bool-ize is a bit of a misnomer as Perl has no boolean data type. The value has to be normalized to something where a numerical comparison (!=) works as intended because non-numerical strings are autoconverted to the integer 0 when used in an numerical comparison. In Perl, this expression

0 != "a"

is false but

!0 != !"a"

is true.

Logical XOR

Posted Jun 11, 2024 19:22 UTC (Tue) by jwilk (subscriber, #63328) [Link]

> Perl has no boolean data type

Since v5.36, it kinda has:

https://perldoc.perl.org/perl5360delta#Stable-boolean-tra...

Logical XOR

Posted Jun 10, 2024 18:25 UTC (Mon) by rweikusat2 (subscriber, #117920) [Link]

a ^^ b is equivalent to (a || b) && !(a && b). In Perl, (a || b) && !(a && b) && (a == b) is possible:

perl -e '$a = 0; $b = 'abc'; print(($a || $b) && !($a && $b) && ($a == $b), "\n")'

:-)

Logical XOR

Posted Jun 11, 2024 22:58 UTC (Tue) by MarcB (guest, #101804) [Link]

It is not really the logical XOR that is new. Perl already had this, named "xor". But "xor" is a low-precedence operator, like "and" or "or" (vs. "&&" or "||"). The high-precedence version of "xor" was missing before, which was an inconsistency.

That is all this change is about. Now all logical operator exist in three versions: bit-wise, high-precedence logical and low-precedence logical.

See https://perldoc.perl.org/perlop#Operator-Precedence-and-A...


Copyright © 2025, Eklektix, Inc.
Comments and public postings are copyrighted by their creators.
Linux is a registered trademark of Linus Torvalds