On a MSWin32 ReadKey function looks like this:
sub ReadKey {
my $File = normalizehandle((@_>1?$_[1]:\*STDIN));
if ($_[0] || $CurrentMode >= 3) {
Win32PeekChar($File, $_[0]);
} else {
getc $File;
}
}
where Win32PeekChar looks like this:
SV * Win32PeekChar(file, delay)
InputStream file
U32 delay <<<<<<<<<<<<<<<<< the trouble!!!
CODE:
{
char key;
if (Win32PeekChar(aTHX_ file, delay, &key))
RETVAL = newSVpv(&key, 1);
else
RETVAL = newSVsv(&PL_sv_undef);
}
OUTPUT:
RETVAL
So calling something like this:
my $x = ReadKey(1e-5);
means that the delay value 1e-5 is converted to U32 (unsigned 32bit integer) which I guess would be 0 (zero), therefore the same as calling my $x = ReadKey(0) - which is exactly what it does (blocking read waiting till you hit any key).
As for the versions:
- Strawberry Perl 5.20.1.1 has TermReadKey-2.31
- Strawberry Perl 5.24.1.1 has TermReadKey-2.37
And if you compare 2.31 vs. 2.37 you will find:
-int Win32PeekChar(PerlIO *file,double delay,char *key)
+int Win32PeekChar(pTHX_ PerlIO *file,U32 delay,char *key)
Note "double delay" vs. "U32 delay"
Full diff:
https://metacpan.org/diff/file?target=JSTOWE%2FTermReadKey-2.37%2F&source=JSTOWE%2FTermReadKey-2.31
So IMHO definitely not a bug Strawberry Perl. ReadKey's Win32PeekChar needs a fix.