Consider the following a large footnote, but in the middle of the page.
A filehandle that has not been successfully opened can still be used without even so much as a warning throughout the program.[ 5 ] If you read from the filehandle, you'll get end-of-file right away. If you write to the filehandle, the data is silently discarded (like last year's campaign promises).
[5] This statement is true, unless you are running with the
-w
switch enabled.
Typically, you'll want to check the result of the open and report an error if the result is not what you expect. Sure, you can pepper your program with stuff like:
unless (open (DATAPLACE,">c:/temp/dataplace")) { print "Sorry, I couldn't create c:/temp/dataplace\n"; } else { # the rest of your program }
But that sort of change is a lot of work. And it happens often enough for Perl to offer a bit of a shortcut. The
die
function takes a list within optional parentheses, spits out that list (like
print
) on the standard error output, and then ends the Perl program with a nonzero
exit status (generally indicating that something unusual happened[
6
]). So, rewriting the chunk of code above turns out to look like this:
[6] Actually,
die
()
merely raises an exception, but because you aren't being shown how to trap exceptions, it behaves as described. See Eval {} in Chapter 3 of Programming Perl or perlfunc for details.
unless (open DATAPLACE,">c:/temp/dataplace") { die "Sorry, I couldn't create c:/temp/dataplace\n"; } # rest of program
But we can go even one step further. Remember that we can use the
||
(logical or) operator to shorten this up, as in:
open(DATAPLACE,">c:/temp/dataplace") || die "Sorry, I couldn't create c:/temp/dataplace\n";
So, the
die
gets executed only when the result of the
open
is false. The common way to read this is "open that file or die!" And that's an easy way to remember whether to use the logical
and
or logical
or
.
The message at death (built from the argument to
die
) has the Perl program name and line number automatically attached, so you can easily identify which
die
was responsible for the untimely exit. If you don't like the line number or file revealed, make sure that the death text has a newline on the end. For example:
die "you gravy-sucking pigs";
prints the file and line number, while
die "you gravy-sucking pigs\n";
does not.
Another handy thing inside die strings is the $! variable, which contains the text relating to the most recent operating system error value. The variable is used like this:
open(LOG, ">>logfile") || die "cannot append: $!";
The program might end up saying "
cannot
append:
Permission
denied
" as part of the message.
There's also the
close call
function, which most people know as
warn
. It does everything
die
does, just short of actually dying. Use it to give error messages on standard error without a lot of extra hassle:
open(LOG,">>log") || warn "discarding logfile output\n";