我有一个 DCL 脚本,我需要在其中调用位于 Perl 脚本中的 Perl 函数。我该如何做到这一点并在 DCL 脚本中捕获该 Perl 函数的输出?
我知道我可以按如下方式调用 Perl 脚本:
$ perl my_perl_script.pl
但是我想调用 Perl 模块中的特定函数,并能够在我的 DCL 脚本中使用该函数的返回值。
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"
请注意,仍然可以为偶数退出值调用处理程序。
我可以想到几种可能性(以前从未真正做过)。
编写一个 Perl 脚本来调用该函数并将结果输出到 STDOUT。然后在 DCL 脚本中,您可以将该输出捕获到文件中并将其读回以使用它。或者,也许,通过 PIPE 捕获输出并处理它。取决于输出是什么以及你想用它做什么,我猜。
或者,似乎有一些用于 Perl 的 OpenVMS 模块允许您获取和设置符号。如果您可以找到其中之一,那么您的 Perl 脚本可以在 DCL 命令文件中设置从该点开始使用的符号。
我倾向于支持后一种选择。
我不相信有一种方法可以直接从 DCL 调用 Perl 函数——就像在 DCL 级别从任何其他语言调用函数一样。
如果它是一个模块,并且您可以使用system()
函数(或类似的东西)访问外壳,那么您可以这样做
perl -MMy::Module -e 'My::Module->new->method;';echo $?
whereMy::Module
是您的模块method
的名称,是您要调用的方法的名称。该echo $?
命令(假设您在 Linux/Unix 系统上)将告诉您 shell 接收到的方法调用的返回值。
这与您在不发布代码的情况下将获得的答案一样具体。