Файловые дескрипторы

Файловым дескриптором называется символическое имя в программе Perl, связывающее процесс Perl с внешним миром через канал ввода/ вывода. Иначе говоря, файловый дескриптор является именем канала ввода/вывода, а не именем файла. Имена файловых дескрипторов подчиняются тем же правилам, что и другие идентификаторы Perl (последовательность букв, цифр и подчеркиваний, которая не может начинаться с цифры). Из-за отсутствия префиксного символа их можно спутать с существующими или будущими зарезервированными словами или метками. Как и в случае с метками, Ларри рекомендует записывать имена дескрипторов в верхнем регистре – такая запись не только делает их более заметными, но и гарантирует, что в программе не произойдет сбой при появлении в будущем новых зарезервированных слов (записываемых в нижнем регистре).

Шесть специальных имен файловых дескрипторов Perl уже использует для своих целей: STDIN, STDOUT, STDERR, DATA, ARGV и ARGVOUT. Хотя вы можете присвоить файловому дескриптору любое имя по своему усмотрению, не применяйте эти шесть имен, если только вы не собираетесь пользоваться их специфическими свойствами. Возможно, некоторые из этих имен вам уже знакомы. При запуске программы файловый дескриптор STDIN обозначает канал ввода/вывода между процессом Perl и тем местом, из которого программа должна получать входные данные (стандартный поток ввода).


Обычно это клавиатура пользователя, если только пользователь не выберет другой источник, например файл или вывод другой программы. Существует также стандартный поток вывода STDOUT. По умолчанию данные выводятся на экран монитора, но как вы вскоре увидите, пользователь может направить вывод в файл или передать его другой программе. Эти стандартные потоки пришли к нам из библиотеки «стандартного ввода/вывода» UNIX, но они практически так же работают в большинстве современных операционных систем. Общий принцип состоит в том, что ваша программа должна «слепо» читать из STDIN и записывать в STDOUT, полагаясь на то, что они правильно заданы пользователем (или программой, запустившей вашу программу). Это позволяет ввести в командном процессоре команду следующего вида:

$ ./your_program wilma

Команда сообщает командному процессору, что входные данные программы должны читаться из файла dino, а вывод должен записываться в файл wilma. Если программа «слепо» читает данные из STDIN, обрабатывает их (так, как вы сочтете нужным) и «слепо» записывает в STDOUT, все будет работать нормально.

От вас даже не потребуется дополнительных усилий для того, чтобы программа могла работать в конвейерах (pipelines).


Это еще одна концепция из мира UNIX, которая позволяет записывать командные строки следующим образом:

$ cat fred barney | sort | ./your_program | grep something | lpr

Если вы незнакомы с этими командами UNIX, ничего страшного. Здесь всего лишь говорится, что команда cat должна вывести все строки файла fred, за которыми следуют все строки файла barney. Выведенные данные подаются на вход команды sort, которая сортирует строки и передает их your_program. После завершения обработки в your_program данные передаются программе grep, которая отфильтровывает одни строки, а другие отправляет команде lpr для печати на принтере. Подобные каналы часто используются в UNIX и других современных системах, потому что они позволяют создавать мощные, сложные команды из простых структурных блоков. Каждый структурный блок хорошо выполняет только одну специализированную операцию; ваша задача – правильно использовать их в сочетании друг с другом.

Наряду с описанными потоками ввода/вывода существует еще один стандартный поток. Если (в предыдущем примере) your_program выдаст какиеQлибо предупреждения или другие диагностические сообщения, они не должны переходить по конвейеру.


Команда grep игнорирует все строки, в которых отсутствуют искомые данные, поэтому, скорее всего, она проигнорирует эти предупреждения. Но даже если предупреждения сохранятся, вероятно, они не должны передаваться вниз другим программам по конвейеру. По этой причине определяется стандартный поток ошибок STDERR. Даже если стандартный вывод передается другой программе или файлу, ошибки будут направлены туда, куда хочет пользователь. По умолчанию ошибки выводятся на экран, но пользователь также может направить их в файл командой вида

$ netstat | ./your_program 2>/tmp/my_errors

Оцените статью: (0 голосов)
0 5 0

Статьи из раздела Perl на эту тему:
Аргументы вызова
Ввод данных оператором <>
Вывод функцией say
Закрытие файлового дескриптора
Запись данных в стандартный вывод

Вернуться в раздел: Perl / 4. Ввод и вывод