open

Синтаксис

open FILEHANDLE, EXPR
open FILEHANDLE

Описание

Открывает файл, имя которого задается выражением EXPR и затем ассоциируется с указателем файла FILEHNDLE.
Если FILEHANDLE представляет собой выражение, в качестве реального имени файла используется его значение. Если аргумент EXPR не указан вообще, то имя открываемого файла содержится в скалярной переменной, имя которой совпадает с FILEHANDLE.
ПРИМЕЧАНИЕ
Обратите внимание, что лексические переменные, объявленные с помощью my использоваться для этой цели не могут, поэтому, если вы используете my, вы обязательно должны применять форму вызова функции, содержащую аргумент EXPR.

Если значение EXPR начинается с символа "<" или не содержит никаких специальных символов, указанный файл открывается для чтения данных. Если имя начинается с ">", предыдущее содержимое файла уничтожается и файл открывается для записи. Если же первыми символами в 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
При необходимости вы можете использовать соглашения bash и начать EXPR с последовательности ">&". В этом случае оставшаяся часть строки интерпретируется как имя указателя файла (или дескриптора файла, если это число), которое должно быть скопировано, а затем открыто. Вы можете использовать & после >, >>, <, +>, +>> и +<. При этом выбранный вами режим должен совпадать с режимом первоначального указателя файла. Приведем в качестве иллюстрации программу, которая сохраняет, перенаправляет и восстанавливает STDOUT и 5TDERR:
#!/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";
Если вы введете вместо имени выражение вида <&=N, где N представляет собой число, то работа open будет эквивалентна вызову функции fdopen библиотеки С применительно к этому дескриптору файла. Например:
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, все не записанные на диск буферы остаются таковыми в обоих процессах, а это означает, что во избежание дублирования выходной информации вы должны не забыть установить переменную $|.

Система полагает, что имя файла, которое передается функции open, не должно содержать в начале и конце пробелов. Такие пробелы автоматически из имени файла удаляются. Для того чтобы открыть файл, внутри имени которого содержится те или иные "неудобные" буквы, необходимо защитить эти пробелы:
$file =~ s/^(\s)/./$1/;
open(FOO, "<$file\0");



2011-04-26 00:53:16 lykich

Thanks




Оставить комментарий:
Ваше Имя:
Email:
Антибот: *  
Ваш комментарий: