I don't know how much help the following idea really will be, since I'm totally befuzzled by the problem. But, have you tried using a lexical variable to hold the filehandle?
open my $datafile, "<", $datafile_name;
I'm not absolutely certain about this, but fairly sure that the file will be closed when this variable goes out of scope. Assuming you're reading the file inside a function, you wouldn't have to do anything to enforce that. Then you can see if that still leads to the same error.
If nothing is wrong with the script, it might just be the C library your Perl was built with.. do you have access to any other computers of different flavour (Unix, Win32; well, VMS would work too *g*, as would some others) that have Perl installed? Try checking there for how the bot behaves, that might give you a hint of what's actually wrong.
Makeshifts last the longest.