As the POD says, when you use ReadKey with 0 or higher, it does the equivalent of getc(3) which is buffered. You need to use non-buffered mode to do what you want. (Also when your program exits, you need to put the terminal back the way it was. I use an END block to allow for abnormal termination.)
Try this:
#!/usr/bin/perl
use strict;
use warnings;
use diagnostics;
use Term::ReadKey;
my $count = 0;
my $char = undef;
ReadMode('cbreak');
while (!defined $char) {
$char = ReadKey(-1);
$count++;
}
print "$count\n";
# Put the terminal back the way you found it.
END {
ReadMode('restore');
}