Итак, Perl предоставляет три стандартных дескриптора STDIN, STDOUT и STDERR, автоматически открытых для файлов и устройств, заданных родительским процессом (вероятно, командным процессором). Если вам понадобятся другие файловые дескрипторы, воспользуйтесь оператором open. Этот оператор выдает запрос к операционной системе на открытие канала ввода/вывода между вашей программой и внешним миром. Несколько примеров:
open CONFIG, "dino";
open CONFIG, "<dino";
open BEDROCK, ">fred";
open LOG, ">>logfile";
Первая команда открывает файловый дескриптор с именем CONFIG для файла dino. Иначе говоря, (существующий) файл dino открывается, а все хранящиеся в нем данные становятся доступными для программы через файловый дескриптор CONFIG. Происходящее напоминает обращение к данным файла через STDIN при включении в командную строку конструкций перенаправления командного процессора вроде <dino. Более того, во втором примере использована именно такая конструкция. Вторая команда делает то же, что и первая, но знак < явно указывает, что файл должен использоваться для ввода, хотя это и так делается по умолчанию. Использовать знак < при открытии файла для ввода необязательно, но мы включаем его, потому что, как показано в третьем примере, со знаком > файл открывается для вывода. Файловый манипулятор BEDROCK открывается для вывода в новый файл с именем fred. По аналогии с тем, как знак > используется для перенаправления вывода в командном процессоре, выходные данные направляются в новый файл с именем fred. Если файл с таким именем уже существует, он стирается и заменяется новым.
Четвертый пример показывает, как использовать два знака > (тоже по аналогии с командным процессором) при открытии файла в режиме присоединения. А именно, если файл уже существует, новые данные будут дописываться в конец. Если же файл не существует, он создается по аналогии с режимом >. Например, режим присоединения удобен при работе с журнальными файлами; программа записывает несколько строк в конец журнала при каждом запуске. Собственно, поэтому в четвертом примере файловый дескриптор назван LOG («журнал»), а файл – logfile.
Вместо имени файла может использоваться любое скалярное выражение, хотя направление обычно лучше задавать явно:
my $selected_output = "my_output";
open LOG, "> $selected_output";
Обратите внимание на пробел после знака >. Perl игнорирует его, но пробел предотвращает неприятные сюрпризы – например, если $selected_output будет содержать строку ">passwd" (что приведет к открытию файла в режиме присоединения, а не в режиме записи). В современных версиях Perl (начиная с Perl 5.6) стал возможен вызов open с тремя аргументами:
open CONFIG, "<", "dino";
open BEDROCK, ">", $file_name;
open LOG, ">>", &logfile_name();
Преимущество этой формы заключается в том, что Perl никогда не спутает режим (второй аргумент) с частью имени файла (третий аргумент), а это повышает уровень безопасности. Но если ваш код должен быть совместим с предыдущими версиями (например, если вы собираетесь отправить его в CPAN), либо обходитесь без этих форм, либо явно пометьте свой код как совместимый только с новыми версиями Perl.