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

I used to get the Members IP address this way:
$_cusIp = $ENV{'HTTP_X_FORWARDED_FOR'} || $ENV{REMOTE_ADDR};
However, I was told that || was old and no longer acceptable and now I should use 'or' like this:
$_cusIp = $ENV{'HTTP_X_FORWARDED_FOR'} or $ENV{REMOTE_ADDR};
so I changed to that, in a lot of places. however, the latter one is the one that works now, since we are not using forwarding anymore so it should be working but the ip addresses are all blank in the database when they were not when using the pipes. So was I wrong in changing to the use of the word or instead of the two pipes?

I have not updated it to do this for now:
$_cusIp = $ENV{'HTTP_X_FORWARDED_FOR'}; $_cusIp = $ENV{REMOTE_ADDR} if !$_cusIp;
Until I find out for sure.

thx,
Richard

Replies are listed 'Best First'.
Re: use of pipes and 'or'
by ikegami (Patriarch) on Jan 22, 2010 at 22:41 UTC

    I was told that || was old and no longer acceptable

    No longer acceptable for what?

    or and || are not equivalent. They have different precedence.

    There are situations where || lends itself better:

    $x = $y || $z; # ok $x = ( $y || $z ); # ok (unrequired parens) $x = $y or $z; # XXX $x = ( $y or $z ); # ok
    $x = $y or $z; means ( $x = $y ) or $z;
    And there are situations where or lends itself better:
    open my $fh, '<', $qfn or die; # ok open(my $fh, '<', $qfn) or die; # ok (unrequired parens) open my $fh, '<', $qfn || die; # XXX open(my $fh, '<', $qfn) || die; # ok
    open my $fh, '<', $qfn || die; means open my $fh, '<', ( $qfn || die );
Re: use of pipes and 'or'
by kennethk (Abbot) on Jan 22, 2010 at 22:36 UTC
    You are likely having issues with precedence. If you check Operator Precedence and Associativity, you'll see || is a very high precedence operator and or is a very low one. In your case, note that || is higher precedence than = and or is lower - || really is the correct choice.

    I don't know who told || is no longer acceptable - while I certainly agree or tends to be easier to read, both are still valid constructs. If you are going to change all || to or, you can maintain functionality by liberal use of parentheses.

Re: use of pipes and 'or'
by InterGuru (Sexton) on Jan 24, 2010 at 14:16 UTC
    Rather than worry about precedence , I always use parentheses whenever there is the slightest doubt. This makes the meaning and intent of the code clear to me, the compiler, and to anyone else reading it -- even if they have no knowledge of the arcane rules of precedence

      This makes the meaning and intent of the code clear to [...] anyone else reading it

      I hear this often, but I don't see the truth of it. For example, take

      my $num_lines = $header_lines + $lines_per_rec * $num_recs;

      Even if you didn't know that multiplication has higher precedence than addition, you still know what the statement does. How about the operators relevant to the topic. Is there any doubt as to what the programmer wants the following to do?

      open my $fh, '<', $qfn or die $!;
      my $foo = $bar || 123;

      Simply assume that the programmer knew what he was doing. Extra parens can actually make it harder to read.

      If you're debugging, simply verify your assumption. Check the statement does what you it should. It's much quicker and more reliable then parsing through the complex statement that would require parens anyway

      That said, I do tend use parens around the parameters of my function calls. But not for readability reasons. I do so because Perl doesn't handle omitting those very well in many circumstances.