This code:
foreach my $file (@data_files) {
open my $fh, '<', $file || croak "Could not open file $file!\n";
my @records = <$fh>;
close $fh;
....
}
produces this error:
readline() on closed filehandle $fh at nut_init_insert.pl line 29.
and I have no idea why.
EDIT: The original post had ‘,’ instead of ‘<‘ in the open statement.
You have a typo in the code you posted (the second arg to
open), but that does not explain the error message. The message for that problem would be this:Your problem is related to precedence. The
||binds too tightly, causing Perl to treat this entire expression as the 3rd argument to open:As a result, even though
openfails (probably because$fileis not a valid file name),croakis not executed (because$fileis true and the||short-circuits). After theopenfails, your program tries to read some lines from an unopened file handle, and you get this error message:You want to use one of the following instead. The second option works (unlike your code) because
oris low precedence.For details on operator precedence, see perlop. The relevant point in your case is that the
||operator has higher precedence than the list separator (comma).