perlvms
СОДЕРЖАНИЕ
- НАЗВАНИЕ
- ОПИСАНИЕ
- Установка
- Организация изображений Perl
- Спецификации файлов
- PERL5LIB и PERLLIB
- Виртуальный отладчик Perl
- PERL_VMS_EXCEPTION_DEBUG
- Командная строка
- Функции Perl
- Переменные Perl
- Стандартные модули с VMS-специфическими различиями
- Дата ревизии
- АВТОР
НАЗВАНИЕ
perlvms - VMS-специфическая документация для Perl
ОПИСАНИЕ
Ниже приведены заметки, описывающие особенности поведения Perl 5 на VMS. Они дополняют обычную документацию Perl 5, поэтому мы сосредоточились на способах, которыми Perl 5 функционирует по-другому под VMS, чем под Unix, а также на взаимодействии между Perl и остальной операционной системой. Мы не пытались дублировать полные описания функций Perl из основной документации Perl, которую можно найти в подкаталоге [.pod] дистрибутива Perl.
Надеемся, эти заметки помогут вам избежать непонимания и бессонных ночей при написании скриптов Perl на VMS. Если вы обнаружите, что что-то упущено, что, по вашему мнению, должно быть здесь, пожалуйста, напишите нам по адресу vmsperl@perl.org.
Установка
Инструкции по сборке и установке Perl 5 можно найти в файле README.vms в главном каталоге исходного кода дистрибутива Perl.
Организация изображений Perl
Базовые изображения
В процессе сборки создаются три изображения Perl. Miniperl.Exe — исполняемое изображение, содержащее всю основную функциональность Perl, но не может использовать расширения Perl XS и имеет жёстко заданный список расположений библиотек для загрузки модулей чисто на Perl. Оно активно используется для сборки и тестирования Perl и различных расширений, но не устанавливается.
Большая часть полного Perl находится в общем изображении PerlShr.Exe, которое предоставляет ядро, к которому подключены исполняемое изображение Perl и все расширения Perl. Обычно оно находится через логическое имя PERLSHR. Хотя возможно разместить изображение в SYS$SHARE для его загружаемости, это не рекомендуется. И хотя вы можете захотеть установить изображение для повышения производительности, вы не должны устанавливать его с привилегиями; если вы это сделаете, результат будет не таким, как ожидается, поскольку привилегии изображения отключаются во время запуска Perl.
Наконец, Perl.Exe — исполняемое изображение, содержащее основную точку входа для Perl, а также некоторые начальные фрагменты кода. Его следует разместить в общедоступном каталоге и сделать исполняемым для всех. Для запуска Perl с аргументами командной строки необходимо определить внешний командный интерпретатор для вызова этого изображения.
Расширения Perl
Расширения Perl — это пакеты, которые предоставляют как XS, так и Perl-код для добавления новой функциональности в Perl. (XS — это мета-язык, который упрощает написание кода C, взаимодействующего с Perl, см. perlxs для получения дополнительной информации.) Perl-код для расширения обрабатывается как любой другой модуль библиотеки — он становится доступным в вашем скрипте через соответствующую инструкцию use или require, и обычно определяет пакет Perl, содержащий расширение.
Часть расширения, предоставленная кодом XS, может быть подключена к остальной части Perl двумя способами. В статической конфигурации объектный код расширения непосредственно связывается с PerlShr.Exe и инициализируется при каждом вызове Perl. В динамической конфигурации машинный код расширения помещается в отдельное общее изображение, которое отображается динамической загрузкой Perl (DynaLoader) при подключении расширения в вашем скрипте use или required. Это позволяет вам поддерживать расширение как отдельную сущность, но требует отслеживания дополнительного общего изображения. Большинство расширений можно настроить как статическими, так и динамическими.
Исходный код расширения обычно находится в собственном каталоге. Обычно предоставляются как минимум три файла: Extshortname.xs (где Extshortname — часть имени расширения после последнего ::), содержащий код XS, Extshortname.pm, модуль Perl-библиотеки для расширения, и Makefile.PL, скрипт Perl, который использует модули библиотеки MakeMaker Perl для генерации файла Descrip.MMS для расширения.
Установка статических расширений
Поскольку статические расширения непосредственно включены в PerlShr.Exe, вам нужно пересобрать Perl, чтобы включить новое расширение. Вам необходимо отредактировать основной файл Descrip.MMS или Makefile, используемый для сборки Perl, добавив имя расширения в макрос ext, и объект расширения в макрос extobj. Вам также потребуется собрать объект расширения, либо добавив зависимости в основной Descrip.MMS, либо используя отдельный Descrip.MMS для расширения. Затем пересоберите PerlShr.Exe, чтобы включить новый код.
Наконец, вам нужно скопировать модуль Perl-библиотеки расширения в подкаталог [.Extname] в одном из каталогов @INC, где Extname — имя расширения, со всеми :: заменены на . (например, модуль библиотеки для расширения Foo::Bar будет скопирован в подкаталог [.Foo.Bar]).
Установка динамических расширений
В общем случае набор дистрибутива расширения Perl содержит файл под названием Makefile.PL, который представляет собой программу Perl, используемую для создания файла Descrip.MMS, который может быть использован для сборки и установки файлов, необходимых для расширения. Набор должен быть распакован в древовидную структуру каталогов **не** в главном каталоге исходного кода Perl, и процедура сборки расширения проста
$ perl Makefile.PL ! Create Descrip.MMS
$ mmk ! Build necessary files
$ mmk test ! Run test code, if supplied
$ mmk install ! Install into public Perl tree Поддержка VMS для этого процесса в текущей версии Perl достаточна для большинства расширений. (См. документацию MakeMaker для получения дополнительной информации о вариантах установки расширений.)
-
подкаталог [.Lib.Auto.Arch$PVersExtname] одного из каталогов в
@INC(где PVers — версия Perl, используемая вами, как указано в$], с '.' заменённым на '_'), или -
один из каталогов в
@INC, или -
каталог, который модуль Perl-библиотеки расширения передаёт DynaLoader при запросе отображения общего изображения, или
-
Sys$Share или Sys$Library.
Если общее изображение не находится ни в одном из этих мест, вам необходимо определить логическое имя Extshortname, где Extshortname — часть имени расширения после последнего ::, которое преобразуется в полную спецификацию файла общего изображения.
Спецификации файлов
Синтаксис
Мы постарались сделать Perl совместимым с VMS-стилем и Unix-стилем спецификаций файлов где это возможно. Вы можете использовать любой стиль или оба в командной строке и в скриптах, но вы не можете комбинировать оба стиля в одной спецификации файла. Perl под VMS интерпретирует пути Unix аналогично CRTL (например, первый компонент абсолютного пути читается как имя устройства для VMS-спецификации файла). В пакете VMS::Filespec предоставляется набор функций для явного преобразования между VMS- и Unix-синтаксисом; его документация содержит более подробную информацию.
Мы старались свести к минимуму зависимость модулей Perl-библиотек от Unix-синтаксиса, но вы можете обнаружить, что некоторые из них, а также некоторые скрипты, написанные для Unix-систем, потребуют использования Unix-синтаксиса, поскольку они будут предполагать, что '/' — это разделитель каталогов и т.д. Если вы обнаружите такие примеры в самом дистрибутиве Perl, пожалуйста, сообщите нам об этом, чтобы мы могли попытаться обойти их.
Также при работе с программами Perl под VMS, если вам нужен синтаксис в конкретном формате операционной системы, вам нужно либо проверить соответствующий логический параметр DECC$, либо вызвать функцию преобразования, чтобы принудительно привести его к этому формату.
Логическое имя функции DECC$FILENAME_UNIX_REPORT изменяет традиционное поведение Perl при преобразовании спецификаций файлов из Unix в VMS-формат, чтобы следовать расширенным правилам обработки символов, ожидаемым теперь CRTL. В частности, когда эта функция активна, ./.../ в пути Unix теперь преобразуется в [.^.^.^.] вместо традиционного VMS [...]. Чтобы обеспечить совместимость с тем, что ожидает MakeMaker, если VMS-путь не может быть преобразован в Unix-путь, он передаётся без изменений, так что unixify("[...]") вернёт [...].
Существует несколько неоднозначных случаев, когда функция преобразования не может определить, является ли входной имя файла в формате Unix или VMS, поскольку теперь спецификации файлов VMS и Unix могут содержать символы, которые могут быть ошибочно приняты за разделители синтаксиса другого типа. Таким образом, некоторые пути просто не могут использоваться в режиме, допускающем наличие обоих типов путей. Perl будет предположить, что неоднозначное имя файла имеет формат Unix.
Допуск точки "." как разделителя версий просто несовместим с определением того, является ли путь в формате VMS или в формате Unix с расширенным синтаксисом файлов. Нет способа узнать, является ли "perl-5.8.6" Unix "perl-5.8.6" или VMS "perl-5.8;6" при передаче его в unixify() или vmsify().
END_OF_DOCUMENT_MARKERЛогическое имя DECC$FILENAME_UNIX_REPORT управляет тем, как Perl интерпретирует имена файлов, в той мере, в которой Perl использует CRTL внутри для многих целей и пытается следовать конвенциям CRTL для отчётов об именах файлов. Функция DECC$FILENAME_UNIX_ONLY отличается тем, что она ожидает, что все имена файлов, передаваемые в C-runtime, уже находятся в формате Unix. Эта функция пока не поддерживается в Perl, поскольку Perl использует традиционные спецификации файлов OpenVMS внутри и в наборе тестов, и пока неясно, будет ли этот режим полезным или применимым. Логическое имя функции DECC$POSIX_COMPLIANT_PATHNAMES является новым в SDK RMS Symbolic Link и включено в OpenVMS v8.3, но пока не поддерживается в Perl.
Имя файла (Регистр)
Perl по умолчанию включает DECC$EFS_CASE_PRESERVE и DECC$ARGV_PARSE_STYLE. Обратите внимание, что последнее срабатывает только при включении расширенного анализа в процессе, в котором выполняется Perl. Когда эти функции явно отключены в среде или CRTL их не поддерживает, Perl следует традиционному поведению CRTL, при котором аргументы командной строки приводятся к нижнему регистру, и возвращаемые спецификации файлов содержат только нижний регистр.
Примечание. Очень легко попасть в затруднительное положение, используя смесь других программ, внешних утилит и скриптов Perl, которые находятся на разных стадиях обработки сохранения регистра. Например, файл, созданный более старой версией утилиты архивирования или утилитой сборки, такой как MMK или MMS, может генерировать имя файла во всех заглавных буквах, даже на томе ODS-5. Если этот имя файла позже извлекается скриптом или модулем Perl в среде сохранения регистра, это имя в верхнем регистре может не соответствовать ожиданиям скрипта Perl в смешанном или нижнем регистре. Лучший способ – использовать подход «все или ничего» к сохранению регистра: либо не использовать его вообще, либо убедиться, что вся ваша цепочка инструментов и среда приложения поддерживают и используют его.
OpenVMS Alpha v7.3-1 и более поздние версии, а также все версии OpenVMS I64 поддерживают чувствительность к регистру как настройку процесса (см. SET PROCESS /CASE_LOOKUP=SENSITIVE). В настоящее время Perl не поддерживает чувствительность к регистру в VMS, но это может быть реализовано в будущем, поэтому программы Perl должны использовать метод File::Spec->case_tolerant, чтобы определить состояние, а не переменную $^O.
Символические ссылки
При построении на томе ODS-5 с включёнными символическими ссылками Perl по умолчанию поддерживает символические ссылки, когда соответствующая поддержка доступна в файловой системе и CRTL (обычно 64-битная OpenVMS v8.3 и более поздние версии). Есть ряд ограничений и оговорок, которые необходимо учитывать при работе с символическими ссылками в VMS. В первую очередь, цель действительной символической ссылки должна быть выражена в формате пути Unix, и она должна существовать на томе, видимом из вашей POSIX корневой директории (см. команду SHOW ROOT в справке DCL). Более подробную информацию о возможностях и требованиях к символическим ссылкам см. в главе 12 руководства по CRTL, поставляемого с OpenVMS v8.3 или более поздних версий.
Расширение подстановочных символов
Спецификации файлов, содержащие подстановочные символы, разрешены как в командной строке, так и внутри Perl globs (например, <*.c>). Если спецификация файла с подстановочными символами использует синтаксис VMS, результирующие спецификации файлов будут следовать синтаксису VMS; если передаётся спецификация в стиле Unix, будут возвращены спецификации в стиле Unix. Подобно поведению подстановки подстановочных символов для оболочки Unix, можно экранировать подстановочные символы командной строки с помощью двойных кавычек " вокруг аргумента командной строки программы perl. Однако из-за удаления " символов, выполняемого C-обработкой argv, вам потребуется экранировать такой конструктор (в каталоге, содержащем файлы PERL.C, PERL.EXE, PERL.H и PERL.OBJ):
$ perl -e "print join(' ',@ARGV)" perl.*
perl.c perl.exe perl.h perl.obj следующим образом (с тройными кавычками):
$ perl -e "print join(' ',@ARGV)" """perl.*"""
perl.* В обоих случаях необработанных аргументов командной строки или при вызовах glob() выполняется расширение подстановочных символов VMS. (Расширение подстановочных символов в стиле csh доступно, если вы используете File::Glob::glob). Если спецификация файла с подстановочными символами содержит указание на устройство или каталог, то результирующие спецификации файлов также будут содержать устройство и каталог; в противном случае информация о устройстве и каталоге удаляется. Результирующие спецификации в стиле VMS будут содержать полное устройство и каталог, а результирующие спецификации в стиле Unix – только ту часть пути к каталогу, которая присутствовала в входной спецификации файла. Например, если ваша стандартная директория – Perl_Root:[000000], расширение [.t]*.* даст спецификации файлов, такие как "perl_root:[t]base.dir", а расширение t/*/* даст спецификации файлов, такие как "t/base.dir". (Это делается для соответствия поведению расширения glob, выполняемому оболочками Unix.)
Аналогично, результирующая спецификация файла будет содержать версию файла только в том случае, если она была указана во входной спецификации файла.
Каналы
Поддерживаются каналы ввода и вывода для дескрипторов файлов Perl; «имя файла» передаётся в lib$spawn() для асинхронного выполнения. Следует быть внимательным и закрывать все открытые вами каналы в скрипте Perl, чтобы избежать появления «осиротевших» подпроцессов при завершении работы Perl.
Вы также можете использовать обратные кавычки для вызова подпроцесса DCL, результат вывода которого используется как возвращаемое значение выражения. Строка между обратными кавычками обрабатывается так, как если бы она была аргументом оператора system (см. ниже). В этом случае Perl дождётся завершения подпроцесса, прежде чем продолжить.
Почтовый ящик (MBX), который Perl может создать для связи с каналом, по умолчанию имеет размер буфера 8192 на 64-битных системах и 512 на VAX. Размер буфера по умолчанию настраивается с помощью логического имени PERL_MBX_SIZE при условии, что значение находится между 128 и SYSGEN параметром MAXBUF включительно. Например, чтобы установить размер почтового ящика на 32767, используйте $ENV{'PERL_MBX_SIZE'} = 32767;, а затем откройте и используйте конструкции каналов. Альтернативой является ввод команды:
$ Define PERL_MBX_SIZE 32767 перед запуском вашей программы с каналами широких записей. Более высокое значение может улучшить производительность за счёт квоты BYTLM UAF.
PERL5LIB и PERLLIB
Элементы среды PERL5LIB и PERLLIB работают, как описано в perl, за исключением того, что разделитель элементов по умолчанию – '|' вместо ':'. Однако при выполнении в оболочке Unix, как определяется логическим именем GNV$UNIX_SHELL, разделитель будет ':'. как на системах Unix. Спецификации каталогов могут использовать либо синтаксис VMS, либо синтаксис Unix.
Отладочная программа Perl с разветвлением
Отладочная программа Perl с разветвлением размещает команды отладчика и вывод в отдельном окне терминала X-11, чтобы команды и вывод от различных процессов не смешивались.
Perl в VMS поддерживает эмуляцию отладочной программы с разветвлением, когда Perl запускается на системе VMS с установленной поддержкой X11.
Чтобы использовать отладочную программу с разветвлением, вам необходимо установить стандартный дисплей на сервер X-11 и настроить переменные среды, ожидаемые Unix.
Отладочная программа с разветвлением требует, чтобы переменная среды TERM имела значение xterm, а переменная среды DISPLAY существовала. xterm должна быть в нижнем регистре.
$define TERM "xterm"
$define DISPLAY "hostname:0.0" В настоящее время значение DISPLAY игнорируется. Рекомендуется устанавливать его равным имени хоста дисплея, серверу и экрану в формате Unix. В будущем значение DISPLAY может быть учтено Perl вместо использования стандартного дисплея.
Полезно всегда использовать отладочную программу с разветвлением, чтобы ввод-вывод скрипта был отделён от ввода-вывода отладчика. Вы можете заставить отладочную программу разветвиться, назначив логическому имени <PERLDB_PIDS> значение, не являющееся идентификатором процесса.
$define PERLDB_PIDS XXXX PERL_VMS_EXCEPTION_DEBUG
Определение PERL_VMS_EXCEPTION_DEBUG как "ENABLE" вызовет отладчик VMS, если возникнет фатальная ошибка, которая не обрабатывается иначе. Цель этого – позволить отладку внутренних проблем Perl, которые могут привести к такому условию.
Это позволяет программисту изучить стек вызова и переменные, чтобы выяснить причину ошибки. Поскольку отладчик вызывается, когда интерпретатор Perl собирается выполнить фатальное завершение, продолжение выполнения в режиме отладки обычно нецелесообразно.
Запуск Perl в отладчике VMS может изменить профиль выполнения программы таким образом, что такие проблемы не воспроизводятся.
Функция kill может быть использована для проверки этой функциональности в программе.
В соответствии с типичным стилем VMS, фактически проверяется только первая буква значения этого логического имени в режиме, нечувствительном к регистру, и оно считается включённым, если это значение «Т», «1» или «Е».
Это логическое имя должно быть определено перед запуском Perl.
Командная строка
Перенаправление ввода-вывода и фоновый режим
Perl для VMS поддерживает перенаправление ввода-вывода в командной строке, используя подмножество синтаксиса Bourne shell:
-
<fileчитает стандартный ввод изfile, -
>fileзаписывает стандартный вывод вfile, -
>>fileдобавляет стандартный вывод вfile, -
2>fileзаписывает стандартную ошибку вfile, -
2>>fileдобавляет стандартную ошибку вfile, и -
2>&1перенаправляет стандартную ошибку в стандартный вывод.
Кроме того, вывод может быть перенаправлен в подпроцесс, используя символ '|'. Всё после этого символа в командной строке передаётся подпроцессу для выполнения; подпроцесс принимает вывод Perl в качестве своего ввода.
Наконец, если командная строка заканчивается '&', вся команда выполняется в фоновом режиме как асинхронный подпроцесс.
Переключатели командной строки
Следующие переключатели командной строки ведут себя по-другому в VMS, чем описано в perlrun. Обратите также внимание, что для передачи переключателей в верхнем регистре в Perl необходимо заключать их в двойные кавычки в командной строке, так как CRTL приводит все необработанные строки к нижнему регистру.
В более новых 64-битных версиях OpenVMS настройка процесса теперь управляет необходимостью использования кавычек для сохранения регистра аргументов командной строки.
- -i
-
Если переключатель
-iприсутствует, но не указано расширение для резервной копии, то редактирование на месте создаёт новую версию файла; существующая копия не удаляется. (Обратите внимание, что если указано расширение, существующий файл переименовывается в резервный файл, как и в других операционных системах, поэтому он не остаётся предыдущей версией под исходным именем файла.) - -S
-
Если переключатель
"-S"или-"S"присутствует и имя скрипта не содержит директории, тогда Perl преобразует логическое имя DCL$PATH в список поиска, используя каждое преобразование в качестве каталога для поиска скрипта. Кроме того, если не указан тип файла, Perl ищет в каждом каталоге файл, соответствующий указанному имени, с пустым типом, типом .pl и типом .com в этом порядке. - -u
-
Переключатель
-uвызывает отладчик VMS после компиляции программы Perl, но до её выполнения. Он не создаёт файл дампа ядра.
Функции Perl
На момент последнего обновления документа следующие функции Perl были реализованы в порте Perl для VMS (функции, помеченные звёздочкой, обсуждаются более подробно ниже):
file tests*, abs, alarm, atan, backticks*, binmode*, bless,
caller, chdir, chmod, chown, chomp, chop, chr,
close, closedir, cos, crypt*, defined, delete, die, do, dump*,
each, endgrent, endpwent, eof, eval, exec*, exists, exit, exp,
fileno, flock getc, getgrent*, getgrgid*, getgrnam, getlogin,
getppid, getpwent*, getpwnam*, getpwuid*, glob, gmtime*, goto,
grep, hex, ioctl, import, index, int, join, keys, kill*,
last, lc, lcfirst, lchown*, length, link*, local, localtime, log,
lstat, m//, map, mkdir, my, next, no, oct, open, opendir, ord,
pack, pipe, pop, pos, print, printf, push, q//, qq//, qw//,
qx//*, quotemeta, rand, read, readdir, readlink*, redo, ref,
rename, require, reset, return, reverse, rewinddir, rindex,
rmdir, s///, scalar, seek, seekdir, select(internal),
select (system call)*, setgrent, setpwent, shift, sin, sleep,
socketpair, sort, splice, split, sprintf, sqrt, srand, stat,
study, substr, symlink*, sysread, system*, syswrite, tell,
telldir, tie, time, times*, tr///, uc, ucfirst, umask,
undef, unlink*, unpack, untie, unshift, use, utime*,
values, vec, wait, waitpid*, wantarray, warn, write, y/// Следующие функции не были реализованы в порте VMS, и их вызов приводит к ошибке (обычно) или неопределённому поведению (редко, мы надеемся):
chroot, dbmclose, dbmopen, fork*, getpgrp, getpriority,
msgctl, msgget, msgsend, msgrcv, semctl,
semget, semop, setpgrp, setpriority, shmctl, shmget,
shmread, shmwrite, syscall Следующие функции доступны в Perl, скомпилированном с Dec C 5.2 или более поздней версией и работающем под VMS 7.0 или более поздней версией:
truncate Следующие функции доступны в Perl, построенном на VMS 7.2 или более поздней версии:
fcntl (without locking) Следующие функции могут быть или не быть реализованы, в зависимости от того, какой тип поддержки сокетов вы включили в свою копию Perl:
accept, bind, connect, getpeername,
gethostbyname, getnetbyname, getprotobyname,
getservbyname, gethostbyaddr, getnetbyaddr,
getprotobynumber, getservbyport, gethostent,
getnetent, getprotoent, getservent, sethostent,
setnetent, setprotoent, setservent, endhostent,
endnetent, endprotoent, endservent, getsockname,
getsockopt, listen, recv, select(system call)*,
send, setsockopt, shutdown, socket Следующая функция доступна в Perl, построенном на 64-битной OpenVMS v8.2 с включенными жёсткими ссылками на диске с форматированием ODS-5. Поддержка CRTL, в принципе, доступна с OpenVMS v7.3-1, а более совершенная поддержка конфигурации могла бы её обнаружить.
link Следующие функции доступны в Perl, построенном на 64-битной OpenVMS v8.2 и более поздних версиях. Поддержка CRTL, в принципе, доступна с OpenVMS v7.3-2, а более совершенная поддержка конфигурации могла бы её обнаружить.
getgrgid, getgrnam, getpwnam, getpwuid,
setgrent, ttyname Следующие функции доступны в Perl, построенном на 64-битной OpenVMS v8.2 и более поздних версиях.
statvfs, socketpair - Тесты файлов
-
Тесты
-b,-B,-c,-C,-d,-e,-f,-o,-M,-s,-S,-t,-T, и-zработают как ожидается. Значения возврата для-r,-w, и-xпоказывают, можете ли вы действительно получить доступ к файлу; это может не отражать защиты файлов на основе UIC. Поскольку реальные и эффективные UIC не различаются под VMS,-O,-R,-W, и-Xэквивалентны-o,-r,-w, и-x. Аналогично, несколько других тестов, включая-A,-g,-k,-l,-p, и-u, не имеют особого смысла под VMS, и значения, возвращаемые этими тестами, отражают то, что ваша процедура CRTLstat()делает с эквивалентными битами в поле st_mode. Наконец,-dвозвращает true, если получает спецификацию устройства без явного каталога (например,DUA1:), а также если получает каталог.Обратите внимание: на некоторых сайтах сообщалось о проблемах при использовании тестов доступа к файлам (
-r,-w, и-x) для файлов, доступ к которым осуществляется через DEC DFS. В частности, поскольку DFS в настоящее время не предоставляет доступ к расширенному заголовку файла на удаленных томах, попытки проверить ACL терпят неудачу, и тесты файлов возвращают false, с$!указывающим, что файла не существует. Вы можете использоватьstatдля этих файлов, так как это проверяет только защиту на основе UIC, а затем вручную проверить соответствующие биты, как определено в stat.h вашего компилятора C, в возвращаемом значении mode, если вам нужна приблизительная оценка защиты файла. - обратные кавычки
-
Обратные кавычки создают дочерний процесс и передают заключенную в них строку в него для выполнения как команды DCL. Поскольку дочерний процесс создается непосредственно через
lib$spawn(), может быть указана любая допустимая строка команды DCL. - binmode FILEHANDLE
-
Оператор
binmodeпопытается убедиться, что преобразование символов управления переносом не происходит при вводе из или выводе в этот дескриптор файла. Поскольку это включает в себя повторное открытие файла и последующее восстановление указателя позиции файла, если эта функция возвращает FALSE, основной дескриптор файла может больше не указывать на открытый файл или может указывать на другую позицию в файле, чем до вызоваbinmode.Обратите внимание, что
binmodeобычно не требуется при использовании обычных дескрипторов файлов; он предоставляется для управления вводом-выводом для существующих файлов с структурой записей при необходимости. Вы также можете использовать функциюvmsfopenв расширении VMS::Stdio, чтобы получить более точный контроль ввода-вывода для файлов и устройств с различными структурами записей. - crypt PLAINTEXT, USER
-
Оператор
cryptиспользует системную службуsys$hash_passwordдля создания хэшированного представления PLAINTEXT. Если USER является допустимым именем пользователя, алгоритм и значения соли берутся из записи UAF этого пользователя. Если нет, то используется предпочтительный алгоритм и соль 0. Зашифрованное значение в формате квадрослова возвращается в виде строки из 8 символов.Возвращаемое значение
cryptможно сравнить с зашифрованным паролем из UAF, возвращаемым функциямиgetpw*, для аутентификации пользователей. Если вы это сделаете, помните, что зашифрованный пароль в UAF генерировался с использованием строчных имен и паролей; вам нужно преобразовать аргументы вcryptв верхний регистр, чтобы убедиться, что вы получите правильное значение:sub validate_passwd { my($user,$passwd) = @_; my($pwdhash); if ( !($pwdhash = (getpwnam($user))[1]) || $pwdhash ne crypt("\U$passwd","\U$name") ) { intruder_alert($name); } return 1; } - die
-
dieзаставит системный код выхода VMS быть кодом SS$_ABORT, если ни одно из значений статусов $! или $? не являются теми, которые заставили бы системный код выхода быть тем, что VMS классифицирует как уровень SEVERE_ERROR для обработки ошибок DCL.Когда
PERL_VMS_POSIX_EXITактивен (см. "$?" ниже), системное значение кода выхода VMS будет содержать одно из значений$!,$?,$^Eили значение Unix 255, закодированное таким образом, что эффективное исходное значение может быть декодировано другими программами, написанными на C, включая Perl и пакет GNV. В соответствии с обычным поведениемdieвне VMS, если$!или$?не равны нулю, одно из этих значений будет закодировано в системном коде выхода VMS. Если оба значения статуса Unix равны 0, а значение$^Eустановлено на ERROR или SEVERE_ERROR, то значение$^Eбудет использоваться в качестве кода выхода как есть. Если ни одно из вышеперечисленного не относится, значение Unix 255 будет закодировано в системный код выхода VMS.Обратите внимание на существенное различие в поведении
dieв режимеPERL_VMS_POSIX_EXIT, так как оно не вызывает статус VMS SEVERE_ERROR при выходе. Значения выхода Unix с 2 по 255 будут закодированы в значения статуса VMS с уровнем успеха. Значение выхода Unix 1 будет закодировано в значение статуса VMS с уровнем ошибки. Это делается для совместимости с тем, как библиотека C VMS кодирует эти значения.Минимальный уровень серьезности, установленный
dieв режимеPERL_VMS_POSIX_EXIT, может быть изменен на ERROR или выше в будущем в зависимости от результатов тестирования и дальнейшего анализа.См. "$?" для описания кодирования значения Unix для создания системного кода VMS, содержащего его.
- dump
-
Вместо того, чтобы вызывать сбой Perl и выводить core dump, оператор
dumpвызывает отладчик VMS. Если вы продолжаете выполнять программу Perl в отладчике, управление будет передано метке, указанной в качестве аргумента кdump, или, если метка не была указана, обратно к началу программы. Все остальные состояния программы (например, значения переменных, открытые дескрипторы файлов) не затрагиваются вызовомdump. - exec LIST
-
Вызов
execприведет к выходу Perl и вызову команды, указанной в качестве аргумента кexecчерезlib$do_command. Если аргумент начинается с '@' или '$' (кроме как частью файла), он выполняется как команда DCL. В противном случае первый токен в командной строке обрабатывается как имя файла образа, и предпринимается попытка вызвать его (используя .Exe и значения по умолчанию процесса для расширения имени файла) и передать оставшуюся часть аргументовexecв него в качестве параметров. Если у токена нет типа файла и он соответствует файлу с нулевым типом, предпринимается попытка определить, является ли файл исполняемым изображением, которое должно вызываться с использованиемMCR, или текстовым файлом, который должен передаваться DCL как процедура команды. - fork
-
Хотя в принципе оператор
forkмог бы быть реализован через (и с теми же довольно серьезными ограничениями, что и) процедуру CRTLvfork(), и хотя для этого есть внутренняя поддержка, реализация никогда не была завершена, делаяforkв настоящее время недоступным. Реальная ядровая функцияfork()ожидается в будущей версии VMS, а псевдо-fork, основанный на потоках интерпретатора, может быть доступен в будущей версии Perl для VMS (см. perlfork). Тем временем используйтеsystem, обратные кавычки или каналы с передачей данных, чтобы создать дочерние процессы. - getpwent
- getpwnam
- getpwuid
-
Эти операторы получают информацию, описанную в perlfunc, если у вас есть необходимые привилегии для извлечения информации UAF указанного пользователя через
sys$getuai. Если нет, то возвращаются только элементы$name,$uid, и$gid. Элемент$dirсодержит каталог входа в систему в формате VMS, а элемент$comment— в формате Unix. Элемент$gcosсодержит поле владельца из записи UAF. Элемент$quotaне используется. - gmtime
-
Оператор
gmtimeбудет работать правильно, если у вас есть рабочая процедура CRTLgmtime(), или если логическое имя SYS$TIMEZONE_DIFFERENTIAL определено как количество секунд, которое нужно добавить к UTC для получения местного времени. (Это логическое имя определяется автоматически, если вы используете версию VMS с встроенной поддержкой UTC.) Если ни одно из этих условий не выполнено, выводится сообщение об ошибке, и возвращаетсяundef. - kill
-
В большинстве случаев
killреализуется с помощью недокументированной системной службы$SIGPRC, которая имеет ту же сигнатуру, что и$FORCEX, но генерирует исключение в целевом процессе, а не заставляет его вызывать$EXIT. В общем случае,killследует поведению функции CRTLkill(), но в отличие от этой функции, может быть вызван из обработчика сигналов. Кроме того, в отличие отkillв некоторых версиях CRTL, Perl'skillпроверяет корректность переданного сигнала и возвращает ошибку, а не пытается отправить неизвестный сигнал.Также отрицательные значения сигналов ничего не делают в VMS; они просто преобразуются в соответствующее положительное значение.
- qx//
-
См. запись об
backticksвыше. - select (системный вызов)
-
Если Perl не был скомпилирован с поддержкой сокетов, системная версия
selectнедоступна. Если поддержка сокетов есть, то системная версияselectработает только для дескрипторов файлов, связанных с сокетами. Она не предоставит информацию о обычных файлах или каналах, так как процедура CRTLselect()не предоставляет эту функциональность. - stat EXPR
-
Так как VMS отслеживает файлы по другой схеме, чем Unix, в полях
st_devиst_inoструктурыstruct statневозможно точно представить идентификатор файла. Perl пытается сделать все возможное, и значения, которые он использует, вряд ли будут одинаковыми для двух разных файлов. Однако мы не можем гарантировать это, поэтому будьте внимательны. - system LIST
-
Оператор
systemсоздаёт дочерний процесс и передаёт его аргументы для выполнения как команды DCL. Поскольку дочерний процесс создаётся непосредственно черезlib$spawn(), может быть указана любая допустимая строка команды DCL. Если строка начинается с '@', она рассматривается как команда DCL безусловно. В противном случае, если первый токен содержит символ, используемый в качестве разделителя в спецификации файла (например,:или]), производится попытка расширения с использованием по умолчанию типа .Exe и системных параметров, и при успехе полученный файл вызывается черезMCR. Это позволяет напрямую вызывать изображение, просто передавая спецификацию файла вsystem, — распространённый в Unix-подобных системах приём. Если у токена нет типа файла, и он соответствует файлу с нулевым типом, то предпринимается попытка определить, является ли файл исполняемым изображением, которое должно вызываться с помощьюMCR, или текстовым файлом, который должен передаваться в DCL как процедура.Если LIST состоит из пустой строки,
systemзапускает интерактивный дочерний процесс DCL таким же образом, как ввод SPAWN в командной строке DCL.Perl ожидает завершения дочернего процесса, прежде чем продолжить выполнение в текущем процессе. Как описано в perlfunc, возвращаемое значение
system— это фиктивный «статус», который следует семантике POSIX, если не включён прагмаuse vmsish 'status'; см. описание$?в данном документе для получения более подробной информации. - time
-
Возвращаемое значение
time— это смещение во времени в секундах от 01-JAN-1970 00:00:00 (как и функция times() в CRTL), чтобы облегчить работу кода, переносимого из мира POSIX/Unix. - times
-
Массив, возвращаемый оператором
times, разделяется по тем же правилам, что и функция CRTLtimes(). Следовательно, элементы «системного времени» всегда будут равны 0, так как в VMS нет разницы между «временем пользователя» и «временем системы», а время, накопленное дочерним процессом, может или не может отображаться отдельно в поле «времени дочернего процесса», в зависимости от того, отслеживает лиtimes()дочерние процессы отдельно. Обратите особое внимание на то, что VAXCRTL (по крайней мере) отслеживает только дочерние процессы, запущенные с помощьюfork()иexec(); он не будет накапливать время дочерних процессов, запущенных через каналы,system(), или обратные кавычки. - unlink LIST
-
unlinkудаляет только самую последнюю версию файла; для удаления всех версий необходимо использовать1 while unlink LIST;Возможно, потребуется внести это изменение в скрипты, написанные для систем Unix, которые ожидают, что после вызова
unlink, файлы с именами, переданными вunlink, не будут существовать. (Примечание: Это можно изменить во время компиляции; если выuse Configи$Config{'d_unlink_all_versions'}—define, тоunlinkбудет удалять все версии файла при первом вызове.)unlinkудаляет файл, если это возможно, даже если это требует изменения защиты файла (хотя он не будет пытаться изменить защиту родительской директории). Вы можете определить, имеете ли вы явный доступ к удалению файла, используя операторVMS::Filespec::candelete. Например, чтобы удалить только файлы, для которых у вас есть доступ на удаление, можно использовать что-то вродеsub safe_unlink { my($file,$num); foreach $file (@_) { next unless VMS::Filespec::candelete($file); $num += unlink $file; } $num; }(или вы можете просто использовать
VMS::Stdio::remove, если вы установили расширение VMS::Stdio, поставляемое с Perl). Еслиunlinkдолжен изменить защиту файла для удаления, и вы прервете его в середине процесса, файл может остаться нетронутым, но с изменённым ACL, позволяющим вам удалять доступ.Это поведение
unlinkдолжно быть совместимо с поведением POSIX, а не с традиционным поведением VMS. - utime LIST
-
Данный оператор изменяет только время изменения файла (дата ревизии VMS) на томах ODS-2 и ODS-5 без включённых дат доступа. На томах ODS-5 с включёнными датами доступа изменяется истинное время доступа.
- waitpid PID,FLAGS
-
Если PID — это дочерний процесс, запущенный с помощью каналов
open()(см. open),waitpidбудет ожидать завершения этого дочернего процесса и вернёт его окончательный статус в$?. Если PID — это дочерний процесс, созданный каким-либо другим способом (например, SPAWNed до запуска Perl),waitpidбудет просто проверять каждую секунду, завершился ли процесс, и вернёт результат, когда это произойдёт. (Если PID указывает процесс, который не является дочерним процессом текущего процесса, и вы запустили Perl с ключом-w, будет выведено предупреждение.)Возвращает PID при успехе, -1 при ошибке. Аргумент FLAGS игнорируется во всех случаях.
Переменные Perl
Следующая информация, специфичная для VMS, относится к указанным «специальным» переменным Perl, помимо общей информации в perlvar. В случае конфликта эта информация имеет приоритет.
- %ENV
-
Работа массива
%ENVзависит от перевода логического имени PERL_ENV_TABLES. Если он определён, он должен быть списком поиска, каждый элемент которого указывает расположение для%ENVэлементов. Если вы говорите Perl прочитать или установить элемент$ENV{имя}, то Perl использует переводы PERL_ENV_TABLES следующим образом:- CRTL_ENV
-
Эта строка сообщает Perl проконсультироваться с внутренним
environмассивом пар «ключ-значение» CRTL, используя имя в качестве ключа. В большинстве случаев он содержит только несколько ключей, но если Perl был вызван через функцию Cexec[lv]e(), как это происходит в некоторых встроенных приложениях Perl или при работе под оболочкой, такой как GNV bash, массивenvironможет быть заполнен вызывающей программой. - CLISYM_[LOCAL]
-
Строка, начинающаяся с
CLISYM_, сообщает Perl проконсультироваться с таблицами символов CLI, используя имя как имя символа. При чтении элемента%ENV, локальная таблица символов сканируется первой, за ней следует глобальная таблица символов. Символы, следующие заCLISYM_, имеют значение при установке или удалении элемента%ENV: если полная строка равнаCLISYM_LOCAL, изменение производится в локальной таблице символов; в противном случае изменяется глобальная таблица символов. - Любая другая строка
-
Если элемент PERL_ENV_TABLES переводится в любую другую строку, эта строка используется в качестве имени таблицы логических имён, которая просматривается с использованием имени в качестве логического имени. Используется обычный порядок поиска режимов доступа.
PERL_ENV_TABLES переводится один раз при запуске Perl; любые изменения, которые вы делаете во время работы Perl, не влияют на поведение
%ENV. Если PERL_ENV_TABLES не определено, Perl по умолчанию сначала обращается к таблицам логических имён, указанным в LNM$FILE_DEV, а затем к массиву CRTLenviron. Этот порядок по умолчанию меняется, когда определено логическое имя GNV$UNIX_SHELL, например, при работе под GNV bash.Для операций с записями %ENV, основанными на логических именах или символах DCL, строка ключа обрабатывается так, как будто она полностью заглавная, независимо от регистра, фактически указанного в выражении Perl. Записи в %ENV, основанные на массиве environ CRTL, сохраняют регистр строки ключа при хранении, а поиск по регистру чувствителен.
При чтении элемента
%ENV, места, на которые указывает PERL_ENV_TABLES, проверяются в порядке очереди, и значение, полученное из первого успешного поиска, возвращается. Если имя элемента%ENVсодержит точку с запятой, она и любые символы после неё удаляются. Они игнорируются при обращении к массиву CRTLenvironили таблице символов CLI. Однако, при поиске в таблице логических имён, суффикс после точки с запятой обрабатывается как индекс перевода, который будет использоваться для поиска. Это позволяет вам искать последовательные значения для логических имён списков поиска. Например, если вы скажете$ Define STORY once,upon,a,time,there,was $ perl -e "for ($i = 0; $i <= 6; $i++) " - _$ -e "{ print $ENV{'story;'.$i},' '}"Perl выведет
ONCE UPON A TIME THERE WAS, предполагая, конечно, что PERL_ENV_TABLES настроено таким образом, что логическое имяstoryнайдено, а не символ CLI или элемент CRTLenvironс тем же именем.При установке элемента
%ENVв определённую строку, соответствующее определение делается в месте, на которое указывает первый перевод PERL_ENV_TABLES. Если это приводит к созданию логического имени, оно определяется в режиме супервизора. (То же самое делается, если существующее логическое имя было определено в режиме выполнения или ядра; существующее логическое имя пользователя или супервизора сбрасывается до нового значения.) Если значение является пустой строкой, перевод логического имени определяется как одинNUL(ASCII\0) символ, так как логическое имя не может переводиться в строку нулевой длины. (Это ограничение не относится к символам CLI или значениям CRTLenviron; они устанавливаются в пустую строку.)Когда элемент
%ENVустанавливается вundef, элемент ищется как если бы он читался, и если он найден, он удаляется. (Элемент, «удаленный» из массива CRTLenvironустанавливается в пустую строку.) Использованиеdeleteдля удаления элемента из%ENVимеет аналогичный эффект, но после удаления элемента делается ещё одна попытка найти элемент, поэтому логическое имя внутреннего режима или имя в другом месте заменит только что удалённое логическое имя. В любом случае изменяется только первое значение, найденное при поиске в PERL_ENV_TABLES. В настоящее время невозможно определить логическое имя списка поиска через %ENV.Элемент
$ENV{DEFAULT}является специальным: при чтении он возвращает текущий по умолчанию диск и каталог Perl, а при записи он сбрасывает их, независимо от определения PERL_ENV_TABLES. Его нельзя очистить или удалить; попытки сделать это игнорируются без сообщения об ошибке.Обратите внимание, что если вы хотите передать любые элементы массива C-локального environ в дочерний процесс, который не запущен с помощью fork/exec или не выполняет программу C, вы можете «продвинуть» их до логических имён в текущем процессе, которые затем унаследуются всеми дочерними процессами, сказав
foreach my $key (qw[C-local keys you want promoted]) { my $temp = $ENV{$key}; # read from C-local array $ENV{$key} = $temp; # and define as logical name }(Вы не можете просто сказать
$ENV{$key} = $ENV{$key}, так как оптимизатор Perl достаточно умен, чтобы исключить выражение.)Не пытайтесь очистить
%ENVсо следующим выражением%ENV = ();, это вызовет ошибку.DELETE/LOGICAL *Вы можете представить, насколько плохи были бы вещи, если бы, например, были удалены логические имена SYS$MANAGER или SYS$SYSTEM.
В настоящее время при первом итерации по %ENV с помощью
keysилиvaluesвы столкнётесь с временной задержкой, так как все логические имена будут считаны для полного заполнения %ENV. Следующие итерации не будут перечитывать логические имена, поэтому они будут работать быстрее, но также не будут отражать никаких изменений в таблицах логических имён, вызванных другими программами.Вам нужно быть осторожными с логическими именами, представляющими файлы, постоянные для процесса, такие как
SYS$INPUTиSYS$OUTPUT. Переводы этих логических имён предваряются двубайтовым двоичным значением (0x1B 0x00), которое необходимо удалить, если вы хотите использовать его. (В предыдущих версиях Perl получить значения этих логических имён было невозможно, так как нулевой байт действовал как маркер конца строки) - $!
-
Строковое значение
$!- это значение, возвращаемое функцией strerror() CRTL, поэтому оно будет включать сообщение VMS для ошибок, специфичных для VMS. Числовое значение$!- это значениеerrno, за исключением случая, когда errno равно EVMSERR, в этом случае$!содержит значение vaxc$errno. Установка$!всегда устанавливает errno в указанное значение. Если это значение EVMSERR, оно также устанавливает vaxc$errno в 4 (NONAME-F-NOMSG), чтобы строковое значение$!не отражало сообщение об ошибке VMS из времени до установки$!. - $^E
-
Эта переменная предоставляет прямой доступ к значениям статуса VMS в vaxc$errno, которые часто более специфичны, чем общие сообщения об ошибках Unix-стиля в
$!. Его числовое значение - это значение vaxc$errno, а его строковое значение - соответствующая строка сообщения VMS, полученная с помощью sys$getmsg(). Установка$^Eустанавливает vaxc$errno в указанное значение.Хотя Perl пытается поддерживать значение vaxc$errno в актуальном состоянии, если errno не равно EVMSERR, оно может не относиться к текущей операции.
- $?
-
Значение «состояние» возвращаемое в
$?синтезируется из фактического кода завершения дочернего процесса таким образом, что приближается к семантике POSIX wait(5), чтобы позволить программам Perl проверять успешное завершение дочерних процессов. Восьми младшие биты$?всегда равны 0 в VMS, так как код завершения процесса может или не может быть сгенерирован исключением.Следующие 8 битов содержат код завершения программы.
Если дочерний процесс следует соглашению программ C, скомпилированных с установленной макрокомандой _POSIX_EXIT, значение состояния будет содержать фактическое значение от 0 до 255, возвращенное этой программой при нормальном выходе.
При установленной макрокоманде _POSIX_EXIT значение выхода 0 в Unix представлено как 1 в собственном статусе VMS, а значения Unix от 2 до 255 закодированы по формуле:
VMS_status = 0x35a000 + (unix_value * 8) + 1.И в специальном случае значения Unix 1 кодирование следующее:
VMS_status = 0x35a000 + 8 + 2 + 0x10000000.Для других кодов завершения используется часть кода завершения дочернего процесса, отвечающая за уровень важности: если уровень важности — успех или информационное сообщение, эти биты все равны 0; если уровень важности — предупреждение, они содержат значение 1; если уровень важности — ошибка или критическое ошибку, они содержат фактические биты уровня важности, что оказывается равным 2 для ошибки и 4 для критической ошибки. Критическая ошибка — это другой термин для статуса severe_error.
В результате
$?всегда будет равно нулю, если выход дочернего процесса указывает на успешное завершение, и отлично от нуля, если произошла ошибка, предупреждение или была запущена программа, совместимая с кодированием значений _POSIX_EXIT и установила статус.Как отличить ненулевое значение, являющееся результатом ошибки VMS, от закодированного статуса Unix? Вы не можете, если не посмотрите на значение ${^CHILD_ERROR_NATIVE}. Значение ${^CHILD_ERROR_NATIVE} возвращает фактическое значение статуса VMS и проверяет биты уровня важности. Если биты уровня важности равны 1, а численное значение для
$?находится в диапазоне от 2 до 255 или 0, то$?точно отражает значение, возвращённое приложением Unix. Если$?равно 1, а биты уровня важности указывают на ошибку VMS (2), то$?получено от значения выхода приложения Unix.На практике скрипты Perl, вызывающие программы, возвращающие значения статуса типа _POSIX_EXIT, ожидают эти значения, а программы, вызывающие традиционные программы VMS, либо ожидают предыдущее поведение, либо просто проверяют ненулевой статус.
И успех всегда имеет значение 0 во всех случаях.
Когда фактический код завершения дочернего процесса VMS является ошибкой, внутренне значение
$!устанавливается на ближайшее значение Unix errno к этой ошибке, так что скрипты Perl, проверяющие сообщения об ошибках, увидят ожидаемое сообщение об ошибке в стиле Unix вместо сообщения VMS.Обратно, при установке
$?в блоке END предпринимается попытка преобразовать значение POSIX в собственный статус, понятный операционной системе при завершении работы Perl. Это сводится к тому, что установка$?в ноль приводит к общему статусу успеха SS$_NORMAL, а установка$?в ненулевое значение приводит к общему статусу ошибки SS$_ABORT. См. также "exit" в perlport.При определении логического имени
PERL_VMS_POSIX_EXITкак "ENABLE", установка$?приведет к кодированию нового значения в$^E, чтобы программы C, ожидающие поведения _POSIX_EXIT, могли автоматически восстановить исходные значения статуса родительского или дочернего процесса от 0 до 255. Если значение статуса как родительского, так и дочернего процесса ненулевое, предполагается, что это фактически собственное значение статуса VMS, которое необходимо передать. Специальное значение 0xFFFF почти что NOOP, так как оно приведет к тому, что текущий собственный статус VMS в библиотеке C станет текущим собственным статусом Perl VMS, и обрабатывается таким образом, так как известно, что это не действительное собственное значение статуса VMS. Рекомендуется использовать только значения в диапазоне нормальных чисел статусов родительского или дочернего процесса Unix, от 0 до 255.Предикат
use vmsish 'status'заставляет$?отражать фактический статус завершения VMS вместо стандартной эмуляции статуса POSIX, описанной выше. Этот предикат также отключает преобразование ненулевых значений в SS$_ABORT при установке$?в блоке END (но ноль по-прежнему будет преобразован в SS$_NORMAL).Не используйте предикат
use vmsish 'status'при включенномPERL_VMS_POSIX_EXIT, так как они иногда запрашивают конфликтующие действия, и последствия игнорирования этого совета будут неопределенными, чтобы позволить будущие усовершенствования обработки выхода POSIX.В общем случае, при включенном
PERL_VMS_POSIX_EXIT, для скриптов DCL или других собственных инструментов VMS будет доступна более подробная информация о статусе выхода, и будет ожидаемая информация для программ Posix. По умолчанию это не установлено, чтобы сохранить обратную совместимость.Прим. Установка
DECC$FILENAME_UNIX_REPORTнеявно включаетPERL_VMS_POSIX_EXIT. - $|
-
Установка
$|для потока ввода-вывода приводит к тому, что данные полностью записываются на диск при каждом написании (т.е. не только в буферы базовой системы RMS для файла). Другими словами, это эквивалентно вызову fflush() и fsync() из C.
Стандартные модули с VMS-специфическими отличиями
SDBM_File
SDBM_File работает правильно в VMS. Однако есть одно небольшое отличие. Файл каталога базы данных, созданный, имеет расширение .sdbm_dir вместо .dir. Файлы .dir — это файлы каталогов файловой системы VMS, и их использование для других целей может вызвать неприемлемые проблемы.
Дата ревизии
Пожалуйста, см. репозиторий git для истории ревизий.
АВТОР
Charles Bailey bailey@cor.newman.upenn.edu Craig Berry craigberry@mac.com Dan Sugalski dan@sidhe.org John Malmberg wb8tyw@qsl.net
© 1993–2023 Larry Wall and others
Licensed under the GNU General Public License version 1 or later, or the Artistic License.
The Perl logo is a trademark of the Perl Foundation.
https://perldoc.perl.org/5.38.0/perlvms