Spec-Zone.ru › Perl 5.38

perlvms

СОДЕРЖАНИЕ

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

НАЗВАНИЕ

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, и значения, возвращаемые этими тестами, отражают то, что ваша процедура CRTL stat() делает с эквивалентными битами в поле 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 мог бы быть реализован через (и с теми же довольно серьезными ограничениями, что и) процедуру 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, если не включён прагма use vmsish 'status'; см. описание $? в данном документе для получения более подробной информации.

time

Возвращаемое значение time — это смещение во времени в секундах от 01-JAN-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 проконсультироваться с внутренним environ массивом пар «ключ-значение» CRTL, используя имя в качестве ключа. В большинстве случаев он содержит только несколько ключей, но если 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 = ();, это вызовет ошибку.

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

Spec-Zone.ru

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