So which is safer more ideal to use : || , or
Derek B. Smith
OhioHealth IT
UNIX / TSM / EDM Teams
"John W. Krahn"
<[EMAIL PROTECTED]
> To
Perl Beginners <[email protected]>
04/28/2005 07:55 cc
PM
Subject
Re: REGEXP removing - il- - -b-f
and - il- - - - f
Jay Savage wrote:
> On 4/27/05, John W. Krahn <[EMAIL PROTECTED]> wrote:
>
>>Jay Savage wrote:
>>
>>> 4> open (V4, "samcmd v4 2>\&1 |" ) || die "unable to open pipe...
>>>Broken?$!";
>>>
>>>Don't do this. the precedence of || is too high. your code attempts
>>>to open a pipe, and if it can't, then it attempts to open "die..." and
>>>starts throwing exceptions.
>>
>>No, that is NOT what happens, it will NEVER attempt to open "die..." with
or
>>without the parentheses. The ONLY time it will attempt to open "die..."
is if
>>there are no parentheses and the expression on the left hand side of the
||
>>operator evaluates to false.
>>
>>open V4, '0' || die $!;
>>
>>But even then it will NOT attempt to open "die..." because die() exits
the
>>program!
>
> Is stand corrected. There is no exception; I guess any time I've run
> into it, I've relied on whatever was opened, and died anyway. But I
> don't know what else to call opens behavior, except attempting to open
> die. Except in the case of parenthesis, as you noted, the behavior of
> open || die sure looks like this to me: open (X, badfile || die).
> The only difference between the two expressions below is the
> precedence of the operator.
>
> [EMAIL PROTECTED]:~> perl -e 'open FH, "< BAdFiLe" || die "$!"'
> [EMAIL PROTECTED]:~> perl -e 'open FH, "< BAdFiLe" or die "$!"'
> No such file or directory at -e line 1.
>
> Open may not technically be trying to open an expression and failing,
> I don't know. To be honest, I've never taken apart the source to see.
> But the appearance is certainly that that's what happens, and the
> result is so similar as to not matter. Especially consider the
> following:
>
> perl -e 'open FH, "< BAdFiLe" || die or die "$!"; print "didnt die\n"
'
> No such file or directory at -e line 1.
>
> Where did the first die go if || didn't attempt to pass it to open?
>
> if the reason for the failed open were the attempt to open "BAdFiLe",
> the first die would execute and the program would exit bore it got to
> the second. But clearly that's not what's happening. The first die
> is getting slurped up by ||, which is presumably trying to pass it on
> to open. When that fails, the second die executes, exiting with $!.
> at least that's what it looks like to me.
>
> So what's really happeneing here?
perldoc perlop
[snip]
C-style Logical Or
Binary "||" performs a short-circuit logical OR operation. That is,
if
^^^^^^^^^^^^^
the left operand is true, the right operand is not even evaluated.
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Perhaps this will help illustrate:
$ perl -MO=Deparse,-p -e'open IN, "BADFILE" || die "ERROR: $!"'
open(IN, 'BADFILE');
-e syntax OK
$ perl -MO=Deparse,-p -e'open IN, "BADFILE" || die or die "ERROR: $!"'
(open(IN, 'BADFILE') or die("ERROR: $!"));
-e syntax OK
Because the string "BADFILE" is true, which is determined at compile time,
it
is as if "|| die" did not exist at all!
Of course if the file name is in a variable then it must be evaluated at
run time:
$ perl -MO=Deparse,-p -e'open IN, $ARGV[0] || die "ERROR: $!"' BADFILE
open(IN, ($ARGV[0] || die("ERROR: $!")));
-e syntax OK
$ perl -MO=Deparse,-p -e'open IN, $ARGV[0] || die or die "ERROR: $!"'
BADFILE
(open(IN, ($ARGV[0] || die)) or die("ERROR: $!"));
-e syntax OK
Where "|| die" will only be evaluated if the variable is false (undef, 0,
'0'
or '').
John
--
use Perl;
program
fulfillment
--
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
<http://learn.perl.org/> <http://learn.perl.org/first-response>
--
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
<http://learn.perl.org/> <http://learn.perl.org/first-response>