One way would be to use native system calls.
- Win32API::File's GetOsFHandle to get the underlying OS handle.
- ReOpenFile the handle with FILE_FLAG_OVERLAPPED.
- CreateEvent to create the event on which to wait.
- ReadFile to start waiting for data.
- WaitForSingleObject with a timeout to wait for input.
- CloseHandle to release the event and the file handle.
The system calls can be accessed via Win32::API and via other modules (such as Win32API::File and Win32::Event).
Update: Oh oops, I had suggested CreateFile, but that isn't applicable. Replaced with ReOpenFile.