Модуль VMS :: DCLsym уже много лет входит в состав ядра Perl и позволяет легко сохранять возвращаемое значение функции (или чего-либо еще) в символе DCL. Вот пример:
$ perl -"MVMS::DCLsym" -e "$x = sprintf('0x%x', 99); VMS::DCLsym->setsym('X', $x, 'GLOBAL');"
$ show symbol x
X == "0x63"
Кроме того, по умолчанию хэш% ENV сопоставляется с логическими именами процессов в режиме супервизора, то есть они сохраняются после выхода из Perl. Итак, вот еще один способ оставить что-то для CLI при выходе из Perl:
$ perl -e "$ENV{'X'} = sprintf('0x%x', 99);"
$ show logical x
"X" = "0x63" (LNM$PROCESS_TABLE)
$ x = f$trnlnm("X")
$ show symbol x
X = "0x63"
Если единственное, что вы хотите передать обратно в DCL, это целочисленное значение, вы можете просто выйти из Perl с этим значением и извлечь его из символа $ STATUS, который всегда доступен в DCL:
$ perl -e "exit 99;"
$ show symbol $status
$STATUS == "%X00000063"
Но здесь есть некоторые сложности, поскольку CLI будет интерпретировать это значение как успешное (нечетные значения) или неудачное (четные значения), в последнем случае вызывая любые соответствующие обработчики предупреждений или ошибок, которые вы настроили, и пытаясь получить текст сообщения , если есть. Другими словами, ожидается, что статусы выхода будут что-то значить для DCL, например, в этом знаменитом пасхальном яйце:
$ perl -e "exit 2928;"
%SYSTEM-W-FISH, my hovercraft is full of eels
Вы можете подавить печать сообщения с помощью прагмы "vmsish 'hushed" ", и пока вы это делаете, вы также можете использовать прагму" vmsish' exit '", чтобы предотвратить отображение 0 на общее значение успеха и 1 к общему значению ошибки, при условии, что они находятся в диапазоне чисел, которые вы можете возвращать. Так что это будет выглядеть примерно так:
$ perl -e "use vmsish 'hushed','exit'; exit 2928;"
$ show symbol $status
$STATUS == "%X10000B70"
Обратите внимание, что обработчики могут по-прежнему вызываться для выходных значений с четными номерами.