Spec-Zone.ru › Perl 5.32

perlvms

СОДЕРЖАНИЕ

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

НАЗВАНИЕ

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

ОПИСАНИЕ

Ниже приведены заметки, описывающие особенности поведения Perl 5 на VMS. Они являются дополнением к обычной документации Perl 5, поэтому мы сосредоточились на способах, которыми Perl 5 функционирует иначе под VMS, чем под Unix, а также на взаимодействии между Perl и остальной операционной системой. Мы не пытались дублировать полные описания функций Perl из основной документации Perl, которую можно найти в подкаталоге [.pod] дистрибутива Perl.

Мы надеемся, что эти заметки помогут вам избежать путаницы и бессонницы при написании скриптов Perl на VMS. Если вы считаете, что что-то упущено, сообщите нам об этом по адресу vmsperl@perl.org.

Установка

Инструкции по построению и установке Perl 5 можно найти в файле README.vms в главном каталоге исходного кода дистрибутива Perl.

Организация изображений Perl

Ядерные изображения

Во время процесса сборки генерируются три изображения Perl. Miniperl.Exe — это исполняемый образ, который содержит всю основную функциональность Perl, но не может использовать расширения Perl XS и имеет жёстко заданный список расположений библиотек для загрузки модулей чисто на Perl. Он широко используется для построения и тестирования Perl и различных расширений, но не устанавливается.

Большая часть полного Perl находится в общем изображении PerlShr.Exe, которое предоставляет ядро, к которому связаны исполняемый образ Perl и все расширения Perl. Обычно он находится по логическому имени PERLSHR. Хотя можно поместить изображение в SYS$SHARE, чтобы его можно было загрузить, это не рекомендуется. И хотя вы можете захотеть установить изображение по соображениям производительности, вы не должны устанавливать его с привилегиями; если вы это сделаете, результат будет не таким, как вы ожидаете, так как привилегии изображения отключаются во время запуска Perl.

Наконец, Perl.Exe — это исполняемый образ, содержащий главную точку входа для Perl, а также некоторый код инициализации. Его следует поместить в общедоступный каталог и сделать его исполняемым для всех пользователей. Для запуска Perl с аргументами командной строки необходимо определить внешний командный файл для вызова этого образа.

Расширения Perl

Расширения Perl — это пакеты, которые предоставляют как XS, так и код Perl для добавления новой функциональности в Perl. (XS — это мета-язык, который упрощает написание кода C, взаимодействующего с Perl, см. perlxs для получения дополнительной информации.) Код Perl для расширения обрабатывается как любой другой модуль библиотеки — он доступен в вашем скрипте через соответствующее use или require утверждение и обычно определяет пакет Perl, содержащий расширение.

Часть расширения, предоставляемая кодом XS, может быть подключена к остальной части Perl двумя способами. В статическом конфигурации объектный код расширения непосредственно связывается с PerlShr.Exe и инициализируется при каждом вызове Perl. В динамическом конфигурации машинный код расширения помещается в отдельное общее изображение, которое отображается загрузчиком динамических модулей Perl, когда расширение 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-библиотеки расширений передает загрузчику динамических модулей при запросе отображения общего изображения, или

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

Логическое имя 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-файловых дескрипторах поддерживаются; «имя файла» передается в 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:

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

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

Обратные кавычки создают дочерний процесс и передают заключённую в них строку для выполнения в качестве команды DCL. Поскольку дочерний процесс создаётся непосредственно с помощью lib$spawn(), может быть указана любая допустимая строка команды DCL.

binmode FILEHANDLE

Оператор binmode попытается убедиться, что при вводе или выводе из/в этот дескриптор файла не происходит преобразования управляющих символов переноса строки. Поскольку это включает в себя повторное открытие файла и восстановление его указателя позиции файла, если эта функция возвращает FALSE, связанный дескриптор файла может больше не указывать на открытый файл или может указывать на другую позицию в файле, чем до вызова binmode.

Обратите внимание, что binmode обычно не требуется при использовании обычных дескрипторов файлов; он предоставляется для управления вводом-выводом в существующие файлы с структурированными записями, когда это необходимо. Вы также можете использовать функцию vmsfopen в расширении VMS::Stdio для более точного управления вводом-выводом в файлы и устройства с различными структурами записей.

crypt PLAINTEXT, USER

Оператор crypt использует системную службу sys$hash_password для получения хешированного представления PLAINTEXT. Если USER — это действительное имя пользователя, алгоритм и значения соли берутся из записи UAF этого пользователя. Если нет, то используется предпочтительный алгоритм и соль 0. Зашифрованное значение в 64 бита возвращается в виде строки из 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 будут закодированы в системных значениях статуса с уровнем серьезности SUCCESS. Значение завершения Unix 1 будет закодировано в системном значении статуса с уровнем серьезности ERROR. Это сделано для совместимости с тем, как библиотека C VMS кодирует эти значения.

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

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

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-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 — это дочерний процесс, созданный каким-либо другим способом (например, запущенный с помощью 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 = ();, это приведёт к фатальной ошибке. Это эквивалентно выполнению следующего действия в 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 практически не изменяет, так как оно приведет к тому, что текущий собственный статус VMS в библиотеке C станет текущим собственным статусом VMS Perl, и обрабатывается таким образом, так как известно, что это не допустимое собственное значение статуса 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–2020 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.32.0/perlvms

Spec-Zone.ru

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