Spec-Zone.ru › Perl 5.36

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, когда расширение used или 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-среду выполнения, уже находятся в формате 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". (Это делается для соответствия поведению расширения glob, выполняемому оболочками Unix.)

Аналогично, полученная спецификация файла будет содержать версию файла только в том случае, если она была в исходной спецификации файла.

Каналы

Поддерживаются входные и выходные каналы в Perl filehandle; «имя файла» передаётся в 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. В будущем Perl может учитывать значение DISPLAY вместо использования отображения по умолчанию.

Может быть полезно всегда использовать виртуальный отладчик, чтобы ввод-вывод скрипта был отделён от ввода-вывода отладчика. Вы можете заставить отладчик работать в виртуальном режиме, присвоив логическому имени <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:), а также если получает каталог.

Обратите внимание: некоторые сайты сообщали о проблемах при использовании тестов доступа к файлам (-r, -w, и -x) для файлов, доступ к которым осуществляется через DFS от DEC. В частности, так как DFS в настоящее время не предоставляет доступ к расширенному заголовку файла на удалённых томах, попытки проверить ACL терпят неудачу, и тесты файлов вернут false, при этом $! укажет, что файла не существует. Вы можете использовать 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. Это сделано для совместимости с тем, как библиотека C VMS кодирует эти значения.

Минимальный уровень серьёзности, устанавливаемый die в режиме PERL_VMS_POSIX_EXIT, может быть изменён на ERROR или выше в будущем, в зависимости от результатов тестирования и дальнейшего анализа.

См. "$?" для описания кодирования значения Unix для получения исходного кода VMS, содержащего его.

dump

Вместо того, чтобы заставлять Perl прерваться и вывести дамп core, оператор 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, kill Perl проверяет корректность переданного сигнала и возвращает ошибку, а не пытается отправить неизвестный сигнал.

Кроме того, отрицательные значения сигналов ничего особенного не делают в 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-подобным способом. Если у токена нет типа файла, и он соответствует файлу с типом null, то производится попытка определить, является ли файл исполняемым изображением, которое следует вызвать с помощью MCR, или текстовым файлом, который следует передать DCL как процедуру команды.

Если LIST состоит из пустой строки, system запускает интерактивный дочерний процесс DCL, так же, как ввод команды SPAWN в командной строке DCL.

Perl ждёт завершения дочернего процесса перед продолжением выполнения в текущем процессе. Как описано в perlfunc, возвращаемое значение system — это фиктивный «статус», который следует семантике POSIX, за исключением случаев, когда прагма use vmsish 'status' активна; подробности см. в описании $? в этом документе.

time

Значение, возвращаемое time, — это смещение во времени в секундах от 01.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 — это дочерний процесс, созданный другим способом (например, запущенный с помощью SPAWN до запуска 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 значение Unix 0 для выхода представляется как VMS-кодом статуса 1, а значения Unix от 2 до 255 кодируются по формуле:

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

А в специальном случае значения Unix 1 кодировка:

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

Для других кодов завершения используется часть кода завершения дочернего процесса, отвечающая за серьезность: если серьезность была успехом или информацией, эти биты равны 0; если серьезность была предупреждением, они содержат значение 1; если серьезность была ошибкой или критической ошибкой, они содержат фактические биты серьезности, которые оказываются равными 2 для ошибки и 4 для критической ошибки. Критическая – это ещё одно название для статуса критической ошибки.

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

АВТОР

Чарльз Бэйли bailey@cor.newman.upenn.edu Крейг Берри craigberry@mac.com Дэн Сугальски dan@sidhe.org Джон Мальмберг 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.36.0/perlvms

Spec-Zone.ru

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