如何从DCL脚本调用Perl函数?

时间:2012-03-15 19:54:00

标签: perl vms dcl

我有一个DCL脚本,我需要调用位于Perl脚本中的Perl函数。我该怎么做并在DCL脚本中捕获该Perl函数的输出?

我知道我可以按如下方式调用Perl脚本:

$ perl my_perl_script.pl

但我想调用Perl模块中的特定函数能够在我的DCL脚本中使用该函数的返回值。

3 个答案:

答案 0 :(得分:1)

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退出后仍然存在。所以这是Perl退出时为CLI留下一些东西的另一种方法:

$ 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并从DCL中始终可用的$ STATUS符号中检索它:

$ 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'”pragma来抑制邮件的打印,当你在它的时候你也想要使用“vmsish'exit'”pragma来阻止0的映射到一般成功值和1到一般失败值,假设它们在您可能返回的数字范围内。所以这看起来像是:

$ perl -e "use vmsish 'hushed','exit'; exit 2928;"
$ show symbol $status
  $STATUS == "%X10000B70"

请注意,仍可以为偶数出口值调用处理程序。

答案 1 :(得分:0)

如果它是一个模块,并且你可以使用system()函数(或类似的东西)访问shell,那么你可以这样做

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

其中My::Module是模块的名称,method是您要调用的方法的名称。 echo $?命令(假设您在Linux / Unix系统上)将告诉您shell接收的方法调用的返回值。

这就像你在没有发布代码的情况下得到的那样具体。

答案 2 :(得分:0)

我可以想到几种可能性(以前从未实际做过)。

编写一个Perl脚本来调用该函数并将结果输出到STDOUT。然后在DCL脚本中,您可以将该输出捕获到文件中并将其读回以使用它。或者,也许,通过PIPE捕获输出并处理它。我想,取决于输出是什么以及你想用它做什么。

或者,Perl似乎有一些OpenVMS模块允许您获取和设置符号。如果您可以找到其中一个,那么您的Perl脚本可以在DCL命令文件中设置从该点开始使用的符号。

我倾向于支持后一种选择。

我认为没有办法直接从DCL调用Perl函数 - 除了有一种方法可以从DCL级别的任何其他语言调用函数。