I think there's no <MYPIPE> if open fails
Yes and no: the first <MYPIPE> does return undef, so the while loop never runs, but you should also be getting a warning "readline() on closed filehandle", indicating that something is wrong. A failed open doesn't have to be fatal, there are plenty of ways to handle the control flow:
if ( open my $fh, ... ) {
while (<$fh>) { ... }
close $fh;
}
else { warn "open: $!" }
# - or -
sub foo {
open my $fh, ... or do { warn "open: $!"; return };
while (<$fh>) { ... }
close $fh;
}
# - or -
FILE: for my $file (@files) {
open my $fh, ...
or do { warn "skipping $file: $!"; next FILE };
while (<$fh>) { ... }
close $fh;
}
# - or -
use Try::Tiny;
try {
open my $fh, ... or die $!;
while (<$fh>) { ... }
close $fh;
}
catch {
warn "error: $_";
};
# same thing, but without the module:
eval {
open my $fh, ... or die $!;
...
;1 } or do {
warn "error: $@";
};
The fourth and fifth examples are different in that they catch any fatal error inside the block, which may or may not be desired.
Update: Added the third example, from this thread. |