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 <beginners@perl.org> 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>