Spec-Zone.ru › Perl 5.34

perlvms

СОДЕРЖАНИЕ

  • НАЗВАНИЕ
  • ОПИСАНИЕ
  • Установка
  • Организация изображений Perl
    • Ядерные изображения
    • Расширения Perl
    • Установка статических расширений
    • Установка динамических расширений
  • Спецификации файлов
    • Синтаксис
    • Регистр имён файлов
    • Символические ссылки
    • Расширение шаблонов
    • Трубы
  • PERL5LIB и PERLLIB
  • Отладочная система Perl с виртуализацией
  • PERL_VMS_EXCEPTION_DEBUG
  • Командная строка
    • Перенаправление ввода-вывода и фоновое выполнение
    • Переключатели командной строки
  • Функции Perl
  • Переменные Perl
  • Стандартные модули с особенностями VMS
    • SDBM_File
  • Дата ревизии
  • АВТОР

НАЗВАНИЕ

perlvms - документация по Perl, специфичная для VMS

ОПИСАНИЕ

Ниже приведены заметки, описывающие детали поведения 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 при 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-библиотеки расширений передаёт загрузчику динамики при запросе отображения общего изображения, или

  • 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.

END_OF_DOCUMENT_MARKER

Разрешение «.» в качестве разделителя версий просто несовместимо с определением, является ли путь именем файла в формате VMS или в формате Unix с расширенным синтаксисом имен файлов. Нет способа узнать, является ли «perl-5.8.6» unix-файлом «perl-5.8.6» или vms-файлом «perl-5.8;6» при передаче его в unixify() или vmsify().

Логическое имя DECC$FILENAME_UNIX_REPORT контролирует, как Perl интерпретирует имена файлов в той мере, в которой Perl внутренне использует CRTL для многих целей и пытается следовать соглашениям CRTL для отчёта об именах файлов. Особенность DECC$FILENAME_UNIX_ONLY отличается тем, что она ожидает, что все имена файлов, переданные в C-среду выполнения, уже находятся в формате Unix. Эта функция пока не поддерживается в Perl, поскольку Perl использует традиционные спецификации имен файлов OpenVMS во внутренней работе и в наборе тестов, и пока неясно, будет ли этот режим полезен или пригоден к использованию. Новое логическое имя функции DECC$POSIX_COMPLIANT_PATHNAMES появилось с SDK для символических ссылок RMS и включено в 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-глобах (например, <*.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». (Это делается для соответствия поведению расширения подстановочных символов, выполняемого 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 вместо использования дисплея по умолчанию.

Полезно всегда использовать виртуализированный отладчик, чтобы I/O скрипта было отделено от I/O отладчика. Можно принудительно запустить виртуализированный отладчик, присвоив логическому имени <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 читает stdin из file,

  • >file записывает stdout в file,

  • >>file дописывает stdout в file,

  • 2>file записывает stderr в file,

  • 2>>file дописывает stderr в file, и

  • 2>&1 перенаправляет stderr в stdout.

Кроме того, вывод может быть перенаправлен в подпроцесс, используя символ '|'. Всё, что следует за этим символом в командной строке, передаётся подпроцессу для выполнения; подпроцесс использует вывод Perl в качестве своего ввода.

Наконец, если командная строка заканчивается '& ', вся команда выполняется в фоновом режиме как асинхронный подпроцесс.

Переключатели командной строки

Следующие переключатели командной строки ведут себя иначе в VMS, чем описано в perlrun. Также обратите внимание, что для передачи переключателей в верхнем регистре в Perl необходимо заключить их в двойные кавычки в командной строке, поскольку CRTL преобразует все нецитированные строки в нижний регистр.

В более новых 64-битных версиях OpenVMS теперь настройка процесса контролирует, требуется ли цитирование для сохранения регистра аргументов командной строки.

-i

Если переключатель -i присутствует, но расширение для резервной копии не указано, то редактирование на месте создает новую версию файла; существующая копия не удаляется. (Обратите внимание, что если расширение задано, существующий файл переименовывается в резервный файл, как и в других операционных системах, поэтому он не остается предыдущей версией под исходным именем файла.)

-S

Если переключатель "-S" или -"S" присутствует и имя скрипта не содержит каталога, то Perl интерпретирует логическое имя DCL$PATH как список поиска, используя каждое преобразование в качестве каталога, в котором необходимо искать скрипт. Кроме того, если тип файла не указан, Perl ищет в каждом каталоге файл, соответствующий заданному имени, с пустым типом, типом .pl и типом .com в указанном порядке.

-u

Переключатель -u вызывает вызов отладчика VMS после компиляции программы Perl, но до её запуска. Он не создаёт файл core dump.

Функции Perl

По состоянию на последнюю редакцию этого документа, в порте Perl для VMS были реализованы следующие функции Perl (функции, помеченные звёздочкой (*), обсуждаются более подробно ниже):

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, и значения, возвращаемые этими тестами, отражают то, что ваша процедура CRTL stat() делает с эквивалентными битами в поле st_mode. Наконец, -d возвращает true, если ей передано описание устройства без явного каталога (например, DUA1:), а также если передаётся каталог.

Обратите внимание на то, что логические имена DECC и атрибуты тома ODS-5 также контролируют значения, возвращаемые для полей даты.

Примечание: Некоторые сайты сообщили о проблемах при использовании тестов доступа к файлам (-r, -w, и -x ) для файлов, к которым осуществляется доступ через DFS DEC. В частности, поскольку DFS в настоящее время не предоставляет доступ к расширенному заголовку файлов на удалённых томах, попытки проверить ACL терпят неудачу, и тесты файлов возвращают ложь, при этом $! указывает, что файл не существует. Вы можете использовать stat для этих файлов, так как это проверяет только защиту на основе UIC, а затем вручную проверить соответствующие биты, как определено в stat.h вашего компилятора C, в возвращаемом значении режима, если вам нужна приблизительная информация о защите файла.

обратные кавычки

Обратные кавычки создают дочерний процесс и передают заключённую в них строку в него для выполнения как команды 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 с уровнем серьёзности SUCCESS. Значение выхода Unix 1 будет закодировано в значении статуса VMS с уровнем серьёзности ERROR. Это делается для совместимости с тем, как библиотека VMS C кодирует эти значения.

Минимальный уровень серьёзности, устанавливаемый 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 мог бы быть реализован посредством (и с теми же довольно жёсткими ограничениями, что и) процедура CRTL vfork(), и хотя для этого существует некоторая внутренняя поддержка, реализация никогда не была завершена, что делает 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 будет работать правильно, если у вас есть рабочая процедура CRTL gmtime(), или если логическое имя SYS$TIMEZONE_DIFFERENTIAL определено как количество секунд, которое нужно добавить к UTC для получения местного времени. (Это логическое имя определяется автоматически, если вы используете версию VMS с встроенной поддержкой UTC.) Если ни одно из этих условий не выполняется, выводится сообщение об ошибке, и возвращается undef.

kill

В большинстве случаев kill реализуется с помощью недокументированной системной службы $SIGPRC, у которой такая же последовательность вызова, как у $FORCEX, но которая выбрасывает исключение в целевом процессе, а не заставляет его вызывать $EXIT. Как правило, kill следует поведению функции CRTL kill(), но, в отличие от неё, может быть вызван из обработчика сигнала. Кроме того, в отличие от kill в некоторых версиях CRTL, Perl's kill проверяет корректность переданного сигнала и возвращает ошибку, а не пытается отправить неизвестный сигнал.

Также отрицательные значения сигналов ничего особенного в VMS не делают; они просто преобразуются в соответствующее положительное значение.

qx//

См. запись об backticks выше.

select (системный вызов)

Если Perl был скомпилирован без поддержки сокетов, версия системного вызова select вообще недоступна. Если поддержка сокетов есть, то версия системного вызова select работает только для дескрипторов файлов, связанных с сокетами. Она не предоставит информацию о обычных файлах или каналах, так как процедура CRTL select() не предоставляет эту функциональность.

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, если нет в силе pragma use vmsish 'status'; см. описание $? в этом документе для более подробной информации.

time

Значение, возвращаемое time, — это смещение во времени в секундах от 01-янв-1970 00:00:00 (так же, как и функция times() CRTL), чтобы упростить работу кода, пришедшего из мира POSIX/Unix.

times

Массив, возвращаемый оператором times, разбивается согласно тем же правилам, что и функция CRTL times(). Поэтому элементы "системного времени" всегда будут равны 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 проконсультироваться с внутренним массивом пар ключ-значение CRTL environ, используя имя в качестве ключа. В большинстве случаев это содержит только несколько ключей, но если Perl был вызван через функцию C exec[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, а затем к массиву CRTL environ. Этот порядок по умолчанию меняется при определении логического имени GNV$UNIX_SHELL, например, при запуске под GNV bash.

Для операций с элементами %ENV на основе логических имен или символов DCL строка ключа обрабатывается как если бы она была полностью заглавной, независимо от фактически заданного регистра в выражении Perl. Элементы в %ENV, основанные на массиве environ CRTL, сохраняют регистр строки ключа при хранении, а поиск регистрозависим.

При чтении элемента %ENV, места, на которые указывает PERL_ENV_TABLES, проверяются в порядке очереди, и возвращается значение, полученное из первого успешного поиска. Если имя элемента %ENV содержит точку с запятой, она и все последующие символы удаляются. Они игнорируются при обращении к массиву CRTL environ или таблице символов 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 или элемент CRTL environ с таким же именем.

Когда элемент %ENV устанавливается в определенную строку, соответствующее определение делается в месте, на которое указывает первый перевод PERL_ENV_TABLES. Если это приводит к созданию логического имени, оно определено в режиме супервизора. (То же самое делается, если существующее логическое имя было определено в режиме выполнения или ядра; существующее логическое имя в режиме пользователя или супервизора сбрасывается до нового значения.) Если значение является пустой строкой, перевод логического имени определяется как один NUL (ASCII \0) символ, так как логическое имя не может переводиться в строку нулевой длины. (Это ограничение не распространяется на символы CLI или значения CRTL environ; они устанавливаются в пустую строку.)

Когда элемент %ENV устанавливается в undef, элемент ищется так, как если бы он читался, и если он найден, удаляется. (Элемент, "удаленный" из массива CRTL environ устанавливается в пустую строку.) Использование 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 = ();, это вызовет ошибку fatal. Это эквивалентно выполнению следующего из DCL:

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-программам проверять успешное завершение дочерних процессов. Нижние 8 бит $? всегда равны 0 в VMS, так как код завершения процесса может или не может быть сгенерирован исключением.

Следующие 8 бит содержат код завершения программы.

Если дочерний процесс следует соглашению C-программ, скомпилированных с макросом _POSIX_EXIT, то значение состояния будет содержать фактическое значение от 0 до 255, возвращаемое этой программой при нормальном выходе.

При установленном макросе _POSIX_EXIT значение выхода 0 в Unix представлено как внутреннее значение VMS 1, а значения Unix от 2 до 255 кодируются по формуле:

VMS_status = 0x35a000 + (unix_value * 8) + 1.

И в особом случае значения Unix 1 кодирование выглядит так:

VMS_status = 0x35a000 + 8 + 2 + 0x10000000.

Для других кодов завершения используется часть кода завершения дочернего процесса, относящаяся к серьёзности ошибки: если серьёзность была успешной или информационной, эти биты равны 0; если серьёзность была предупреждением, они содержат значение 1; если серьёзность была ошибкой или критическим ошибкой, они содержат фактические биты серьёзности, которые оказываются равными 2 для ошибки и 4 для critical_error. Critical – это другое название для статуса 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. Рекомендуется использовать только значения в диапазоне от 0 до 255, которые соответствуют нормальным числам статуса родительского или дочернего процесса Unix.

Предикат 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–2021 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.34.0/perlvms

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API