На этом шаге мы рассмотрим дескриптора-дубликат и его использование.
Если в строке имени файла после префикса режима открытия следует амперсанд "&", то ее оставшаяся часть рассматривается как имя дескриптора файла, а не как имя открываемого файла. В этом случае создается независимая копия этого дескриптора с именем, заданным первым параметром функции open(). Оба дескриптора имеют общий указатель текущей позиции файла, но разные буферы ввода/вывода. Закрытие одного из дескрипторов не влияет на работу другого. В программах Perl возможность создания копии дескриптора в основном применяется для восстановления стандартных файлов ввода/вывода после их перенаправления на другие файлы.
Следующий пример иллюстрирует использование дескрипторов-дубликатов:
#! perl -w # Создание копии дескриптора STDOUT. open(OLDOUT, ">&STDOUT"); # Перенаправление стандартного вывода. open(STDOUT, "> file.out") or die "Невозможно перенаправить STDOUT: $!"; # Печать в файл file.out. print "Информация в перенаправленный STDOUT\n"; # Закрытие перенаправленного дескриптора стандартного вывода. close(STDOUT) or die "Невозможно закрыть STDOUT: $!"; # Восстановить файл стандартного вывода. open(STDOUT, ">&OLDOUT") or die "Невозможно восстановить STDOUT: $!"; # Закрыть копию дескриптора стандартного вывода STDOUT. close(OLDOUT) or die "Невозможно закрыть OLDOUT: $!"; # Печать в восстановленный файл стандартного вывода. print "Информация в восстановленный STDOUT\n";
На следующем шаге мы рассмотрим функцию close().