Beefy Boxes and Bandwidth Generously Provided by pair Networks
There's more than one way to do things

Re: Scratching my head...

by turnstep (Parson)
on May 01, 2001 at 01:03 UTC ( #76747=note: print w/replies, xml ) Need Help??

in reply to Scratching my head...

Change that to:

open INFILE, "$inputfn" or die "Error reading input file: $!\n";
or perhaps:
open(INFILE, "$inputfn") || die "Error reading input file: $!\n";

The problem is the precedence of || and ",". In your code, if open fails to open $inputfn for any reason, it tries to "open" the die statement! Use parens to say what you really mean, or use the ultra-low priority "or" operator, which makes the comma act as you might expect.

(Of course, this applies to both of your opens. When in doubt, use parenthesis around all your function calls.)

Replies are listed 'Best First'.
Re: Re: Scratching my head...
by virtualsue (Vicar) on May 01, 2001 at 01:31 UTC
    This nicely illustrates the reason why I never use the 'open () || die' idiom, and I wish others wouldn't use it either. I think it suckers people into making this mistake, which in turn causes them a lot of needless debugging hell.

      What idiom do you use? I strongly prefer using "or" myself, but there is nothing wrong with using || as long as you get the parens straight. Besides, the 'debugging hell' tends to teach a very important lesson on the importance of precedence. :)

        I not only prefer "or", I have gone as far as coercing coworkers to use it as well, for the simple reason that "or" always works as expected in this type of statement. I'm a strong believer in Defensive Programming, and avoiding "debugging hell" at all costs. I honestly don't think that the lesson in this case is worth the potential time waste. This is only my opinion, I am definitely not telling anyone else here what to do.
Re: Re: Scratching my head...
by buckaduck (Chaplain) on May 01, 2001 at 01:08 UTC
    I hope you used "or" instead of "||" in the output file, too. Otherwise, you may be inadvertently skipping the die() call.

    Update: Sorry, turnstep has explained it more completely now...


Re: Re: Scratching my head...
by spudzeppelin (Pilgrim) on May 01, 2001 at 01:27 UTC

    My bad, actually the existing code already has the open() || die () syntax. That's what I get for trying too hard to scrub any meaningful proprietary content from it *g*.

    So it isn't the ||s. One other thing to rule out: any kind of condition where it wouldn't be called at all -- this is main-line code in a subroutine called inside a while loop on the result set of a database query, with adjacent results both above and below it in the result set executing flawlessly. Like I said, this problem is spurious -- I can't pin down any cause (or even a predictable failure) whatsoever within the software.

    Spud Zeppelin *

      Well, if the file is not getting created, and nothing shows up on the die, and you have the parens correct (grin) then I would suggest:

      • Open is being blocked and hangin as it waits to open the file (not likely)
      • Something is erasing the file after it is written.
      • Something is intercepting your die messages.

      The first two depend on the rest of your code. The last can be checked with a quick insert of:

      my $tmperror = "/tmp/temp.error"; open(STDERR, ">$tmperror") or die "Ironic: Cannot write errors to $tmperror: $!\n";
      right before the open and see if it catches anything. Throw an error in on purpose to see if the temp file gets the error.

        Going through these one at a time:

        • Open is being blocked and hangin as it waits to open the file (not likely)
          You're right -- this seems highly unlikely in light of the fact that the script continues and processes the next record in sequence just fine.
        • Something is erasing the file after it is written.
          Maybe. It's the next angle to pursue I suppose. *grumble* I pretty well exhausted this one when I first learned of the problem... "Is the reaper functioning properly? etc."
        • Something is intercepting your die messages.
          I tested the test die call and it died cleanly.

        Spud Zeppelin *

Log In?

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: note [id://76747]
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others drinking their drinks and smoking their pipes about the Monastery: (2)
As of 2021-10-25 23:09 GMT
Find Nodes?
    Voting Booth?
    My first memorable Perl project was:

    Results (90 votes). Check out past polls.