Как вызвать функцию Perl из сценария DCL? - PullRequest
0 голосов
/ 15 марта 2012

У меня есть сценарий DCL, где мне нужно вызвать функцию Perl, расположенную в сценарии Perl.Как мне это сделать и записать вывод этой функции Perl в сценарий DCL?

Я знаю, что, вероятно, я могу вызвать сценарий Perl следующим образом:

$ perl my_perl_script.pl

Но я хочу вызватьконкретная функция в модуле Perl и сможет использовать возвращаемое значение из этой функции в моем сценарии DCL.

Ответы [ 3 ]

1 голос
/ 22 апреля 2012

Модуль 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"

Обратите внимание, что обработчики могут по-прежнему вызываться для выходных значений с четными номерами.

0 голосов
/ 19 марта 2012

Есть пара возможностей, о которых я могу подумать (никогда раньше этого не делал).

Написать сценарий Perl для вызова функции и вывести результат в STDOUT. Затем в сценарии DCL вы можете записать этот вывод в файл и прочитать его обратно, чтобы использовать его. В качестве альтернативы, возможно, захватить вывод через PIPE и обработать его. Полагаю, что зависит от выходных данных и что вы хотите с ними сделать.

В качестве альтернативы, существуют некоторые модули OpenVMS для Perl, которые позволяют вам получать и устанавливать символы. Если вы можете найти один из них, тогда ваш Perl-скрипт может установить символ, который будет использоваться с этого момента в командном файле DCL.

Я предпочитаю последний вариант.

Я не верю, что есть способ вызова функции Perl напрямую из DCL - равно как и способ вызова функции из любого другого языка на уровне DCL.

0 голосов
/ 16 марта 2012

Если это модуль и вы можете получить доступ к оболочке с помощью функции system() (или чего-то подобного), то вы можете просто сделать

perl -MMy::Module -e 'My::Module->new->method;';echo $?

, где My::Module - это имя вашего модуляmethod - это имя метода, который вы хотите вызвать.Команда echo $? (при условии, что вы работаете в системе Linux / Unix) сообщит вам возвращаемое значение из вызова метода, полученное оболочкой.

Это примерно так же, как и ваш ответ 'Вы получите без публикации вашего кода.

...