В чем разница между <stdin> и <STDIN>?

Когда я использую <stdin> в файлах Perl (*.pm), он не читает ввод с клавиатуры, но когда я использую <stdin> в том же месте, он отлично работает.

Почему он не получает ввод, когда я использую <stdin>?

Ответы

Ответ 1

STDIN является документированным дескриптором файла. Существует также STDIN, который сглажен до STDIN, но он работает только в пакете main::: main::stdin совпадает с main::stdin (как описано в perlop - Perl-операторы и приоритет).

Таким образом, в пакете

package My::Package;
sub xx {
    print while <stdin>;
}

STDIN интерпретируется как My::Package::stdin, которого не существует. Вы можете использовать main::stdin из пакета, но использование стандартного STDIN (который всегда указывает на main::stdin, даже из пакета) намного чище.

Ответ 2

Не знал об этом, но обнаружил, что он задокументирован в абзаце с отбрасыванием в perlop

Параметры файла STDIN, STDOUT и STDERR предопределены. (Файлы дескрипторов STDIN, STDOUT и STDERR также будут работать, кроме как в пакетах, где они будут интерпретироваться как локальные идентификаторы, а не глобальные.) Дополнительные дескрипторы файлов могут быть созданы с помощью функции open(), среди прочих. См. Perlopentut и "open" в perlfunc для получения подробной информации об этом.