in reply to Looping line-by-line through STDIN before EOF is received

foreach puts the diamond op (<>) in a list context, which means that it reads until EOF, then splits it up into a list. You want it in scalar context:
while (<$FH>) { sleep $time; print; }
By the way, I changed your $_ to $FH, because it was screwing with the $_ that's the default variable in a loop. I don't know how that didn't mess you up in your code... but it did when I tried it.