openСинтаксисopen FILEHANDLE, EXPR ОписаниеПРИМЕЧАНИЕ Обратите внимание, что лексические переменные, объявленные с помощью my использоваться для этой цели не могут, поэтому, если вы используете my, вы обязательно должны применять форму вызова функции, содержащую аргумент EXPR. ПРИМЕЧАНИЕ Перечисленные префиксы соответствуют режимам открытия файла с помощью функции fopen - "г", "r+", "w", "w+", "а" и "а+". Если имя файла начинается с "|", оно интерпретируется как команда системы, в которую будет направлен по конвейеру весь выходной поток данных, а если имя заканчивается "|", то это имя интерпретируется как команда системы, чей выход будет являться входными данными, поступающими в Perl-программу при считывании данных через указатель файла. Использование в качестве префикса символа "-" означает открытие файла стандартного ввода STDIN, а префикс ">-" приводит к открытию STDOUT. Функция open в случае успешного завершения возвращает результат, отличный от нуля, и undef в противном случае. Если в процесс открытия вовлечен конвейер, то возвращаемое значение представляет собой идентификатор соответствующего подпроцесса. Если вам не повезло и приходится эксплуатировать Perl на операционных системах, которые не в состоянии отличить текстовый файл от объектного, см. описание функции binmode. В общем случае включать этот режим не нужно только на современных операционных системах, к которым относятся, например, Unix или Linux. Несколько примеров вызова функции open: $ARTICLE = 100; open ARTICLE or die "He удается найти статью SARTICLE: $!\n"; while (<ARTICLE>) {... # открываем для нашей программы специальный журнал протокола # ошибок и предупреждений, поскольку идентификатор LOG # зарезервирован open(LOG, '>>/usr/spool/news/twitlog'); open(DBASE, '+<dbase.mine'); # открываем для обновления open(ARTICLE, "caesar <$article |"); # расшифровка статьи open(EXTRACT, "|sort >/tmp/Tmp$$"); # $$ - это наш PID #!/usr/bin/perl open(SAVEOUT. ">&STDOUT"); open(SAVEERR, ">&STDERR"); open(STDOUT, ">foo.out") || die "He могу перенаправить stdout"; open(STDERR. ">&STDOUT") || die "He могу сдублировать stdout"; select(STDERR); $| = 1; # отключаем буферизацию select(STDOUT); $| = 1; # отключаем буферизацию # это сработает и в субпроцессах print STDOUT "stdout l\n"; print STDERR "stderr l\n"; close(STDOUT); close(STDERR); open(STDOUT, ">&SAVEOUT"); open(STDERR, ">&SAVEERR"); print STDOUT "stdout 2\n"; print STDERR "stderr 2\n"; open(FILEHANDLE. "<&=$fd")Если вы открываете конвейер применительно к команде "-", то есть указываете в качестве имени файла "|-" или "-|", это приводит к выполнению неявной команды fork и возвращаемое значение open представляет собой идентификатор сгенерированного процесса в процессе-родителе и 0 в дочернем процессе. Для определения успешности завершения вызова open необходимо использовать функцию defined. Указатель файла после этой операции для родителя ведет себя вполне обычно, но весь ввод-вывод через него прокачивается через буферы STDOUT/STDIN дочернего процесса. В самом дочернем процессе соответствующие файлы не открываются, и ввод-вывод осуществляется через вновь созданные STDOUT и STDIN. Обычно такие "штучки" используются в тех случаях, когда вы хотите получить дополнительный контроль за выполнением команды, активизируемой по конвейеру, например при использовании механизма setuid или нежелании сканировать команды оболочки на предмет метасимволов. Приводимые ниже два фрагмента в значительной степени эквивалентны и демонстрируют, как описанный подход применяется на практике: open(FOO, "|tr '[a-z] ' '[A-Z]'"); open(FOO, "|-") || exec 'tr', '[a-z]', '[A-Z]'; open(FOO, "cat -n '$file'|"); open(FOO, "-|") || exec 'cat', '-n', $file; ПРИМЕЧАНИЕ При любой операции, которая может выполнять fork, все не записанные на диск буферы остаются таковыми в обоих процессах, а это означает, что во избежание дублирования выходной информации вы должны не забыть установить переменную $|. $file =~ s/^(\s)/./$1/; open(FOO, "<$file\0");
|