Re: REGEXP removing - il- - -b-f and - il- - - - f
- From: DBSMITH@xxxxxxxxxxxxxx
- Date: Fri, 29 Apr 2005 08:43:09 -0400
So which is safer more ideal to use : || , or
Derek B. Smith
OhioHealth IT
UNIX / TSM / EDM Teams
"John W. Krahn"
<krahnj@xxxxxxxxx
> To
Perl Beginners <beginners@xxxxxxxx>
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 <krahnj@xxxxxxxxx> 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.
>
> jsavage@ariadne:~> perl -e 'open FH, "< BAdFiLe" || die "$!"'
> jsavage@ariadne:~> 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: beginners-unsubscribe@xxxxxxxx
For additional commands, e-mail: beginners-help@xxxxxxxx
<http://learn.perl.org/> <http://learn.perl.org/first-response>
.
- Follow-Ups:
- Re: REGEXP removing - il- - -b-f and - il- - - - f
- From: John Doe
- Re: REGEXP removing - il- - -b-f and - il- - - - f
- From: Ing. Branislav Gerzo
- Re: REGEXP removing - il- - -b-f and - il- - - - f
- References:
- Re: REGEXP removing - il- - -b-f and - il- - - - f
- From: John W. Krahn
- Re: REGEXP removing - il- - -b-f and - il- - - - f
- Prev by Date: RE: How can I automate the removal of hard-coded banners from locallysaved web pages
- Next by Date: Re: REGEXP removing - il- - -b-f and - il- - - - f
- Previous by thread: Re: REGEXP removing - il- - -b-f and - il- - - - f
- Next by thread: Re: REGEXP removing - il- - -b-f and - il- - - - f
- Index(es):
Relevant Pages
|