boerni has asked for the wisdom of the Perl Monks concerning the following question:

Hey Monks I never realized perl behaves like this. There is a difference between (! 'a' eq 'b') and ('a' ne 'b').
#!perl use strict; use warnings; use Data::Dumper; my $s1 = 'bla'; my $s2 = 'blu'; my $r = $s1 eq $s2; print Dumper $r; if (! $s1 eq $s2) { print "$s1 and $s2 are not the same\n"; } else { print "$s1 and $s2 are the same\n"; } exit 0;
$VAR1 = ''; bla and blu are the same

The "correct" ($s1 ne $s2) works as expected. But why does (! $s1 eq $s2) not work?

Probably there is a simple explanation but I don't know it... Maybe one of you Monks can explain this.

Thank you

Replies are listed 'Best First'.
Re: ne vs. ! eq
by haukex (Bishop) on Feb 25, 2020 at 13:38 UTC

    Precedence. See perlop: ! $s1 eq $s2 is the same as (!$s1) eq $s2, and not !( $s1 eq $s2 ), as B::Deparse will tell you:

    $ perl -MO=Deparse,-p -e 'if (! $s1 eq $s2) {}' if (((!$s1) eq $s2)) { (); }

    You'll need to write either if ( !( $s1 eq $s2 ) ), if ( not $s1 eq $s2 ), unless ( $s1 eq $s2 ), or of course if ( $s1 ne $s2 ).

      Thank you very much haukex!
Re: ne vs. ! eq
by LanX (Cardinal) on Feb 25, 2020 at 19:54 UTC
    Just wanted to add:

    That's a good demo to highlight why Perl has two boolean negations: not and !

    Cheers Rolf
    (addicted to the Perl Programming Language :)
    Wikisyntax for the Monastery