В чем разница между <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 для получения подробной информации об этом.