Чтение из файлового дескриптора является операцией блокировки. Если вы пытаетесь читать из STDIN, и нет ввода, ваша программа будет ждать, пока ввод не будет. Эффект можно проиллюстрировать, запустив программу-фильтр, например, grep без ввода:
$ grep foo
_
grep ждет ввода. Если вы что-то наберете и нажмете Ctl-d, чтобы закрыть STDIN, чтение grep получит ваш ввод, проверит совпадение, напечатает совпадение, если оно есть, и выйдет.
Теперь представьте, что вы пишете сетевое приложение, такое как IRC-клиент, который должен выполнять чтение из нескольких разных соединений во время выполнения основного цикла графического интерфейса. Эту проблему решает select ().
Вот статья, которая должна дать вам подробное объяснение: http://www.perlfect.com/articles/select.shtml